Sto provando a scrivere una grammatica ANTLR per un piccolo linguaggio di query. Le query sono un elenco di termini di ricerca limitate a campi specifici:Catch-all seconda alternativa per la mia regola di avvio
campo1: un field2: b field3: c
che dovrebbe restituire un elenco di soggetti, quando field1 corrisponde a una, field2 partite b, e così via. Le query possono essere anche completamente senza restrizione:
abc
che dovrebbe tornare entità con qualsiasi campo che corrisponde a abc. Ecco la grammatica ANTLR:
@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;}
;
voglio query senza restrizioni di essere qualsiasi testo che non corrisponde prima alternativa della regola query.
1) C'è un modo migliore per afferrare il testo che corrisponde alla seconda alternativa?
2) Quando lo collego al mio server web, il campo parserQuery unrestrictedQuery risolve l'ultimo carattere della query. Sembra che l'azione venga chiamata per ogni carattere della query quando voglio veramente l'intera stringa.
Grazie per la lettura!
Il '*' in 'UNRESTRICTED_QUERY = *' corrisponde qualsiasi quantità di gettoni. Non * corrisponde * a qualsiasi numero di caratteri! Grande differenza. –
Hai assolutamente ragione. Grazie. –