2012-11-09 18 views
5

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!

+1

Il '*' in 'UNRESTRICTED_QUERY = *' corrisponde qualsiasi quantità di gettoni. Non * corrisponde * a qualsiasi numero di caratteri! Grande differenza. –

+0

Hai assolutamente ragione. Grazie. –

risposta

1

"Desidero che le query senza restrizioni siano qualsiasi testo che non corrisponde alla prima alternativa della regola di query". Questa è una pessima decisione di progettazione. Che cosa succede se in futuro vuoi aggiungere Field4? Quindi si verifica l'incompatibilità. Meglio cambiare la grammatica in modo che le query senza restrizioni siano facilmente riconoscibili. valori dei campi Surround (a, b, c) con le citazioni, o iniziano interrogazione senza restrizioni con i due punti:..

field1:a :abc field2:b