Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Catch-all second alternative for my start rule

I'm trying to write an ANTLR grammar for a little query language. Queries are a list of search terms restricted to specific fields:

field1:a field2:b field3:c

That's supposed to return a list of entities where field1 matches a, field2 matches b, and so on. Queries can also be completely unrestricted:

abc

That's supposed to return entities with any field that matches abc. Here's the ANTLR grammar:

@members {
  String unrestrictedQuery;
}

FIELD1_OPERATOR: 'field1:';
FIELD2_OPERATOR: 'field2:';
FIELD3_OPERATOR: 'field3:';
DIGIT: '0'..'9';
LETTER: 'A'..'Z' | 'a'..'z';

query: subquery (' ' subquery)*
  | UNRESTRICTED_QUERY=.* {unrestrictedQuery = $UNRESTRICTED_QUERY.text;}
  ;

I want unrestricted queries to be any text that doesn't match the query rule's first alternative.

1) Is there a better way to grab the text that the second alternative matched?

2) When I plug this into my web server, the unrestrictedQuery parser field resolves to the last character of the query. It seems like the action gets called for every character of the query when I really want the whole string.

Thanks for reading!

like image 976
Juan C Nuno Avatar asked Nov 12 '22 18:11

Juan C Nuno


1 Answers

"I want unrestricted queries to be any text that doesn't match the query rule's first alternative". This is a bad design decision. What if in future, you want to add Field4? Then incompatibility occur. Better change the grammar so that unrestricted queries are easily recognized. Surround field values (a, b, c) with quotes, or start unrestricted query with a colon:

field1:a :abc field2:b
like image 96
Alexei Kaigorodov Avatar answered Nov 15 '22 11:11

Alexei Kaigorodov