ANTLR su un flusso di dati rumoroso
-
29-09-2019 - |
Domanda
Sono molto di nuovo nel mondo ANTLR e sto cercando di capire come posso usare questo strumento di analisi per interpretare una serie di stringa "rumorosa". Quello che vorrei realizzare è il seguente.
Prendiamo ad esempio questa frase: It's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV
Quello che vorrei è estratto CAT
, SLEEPING
e SOFA
e hanno una grammatica che partita con facilità il seguente schema: OGGETTO - VERBO - oggetto indiretto ... dove potrei definire
VERB : 'SLEEPING' | 'WALKING';
SUBJECT : 'CAT'|'DOG'|'BIRD';
INDIRECT_OBJECT : 'CAR'| 'SOFA';
ecc .. Io non voglio finisce con un "NoViableException" permanente come io non posso descrivere tutte le possibilità intorno alla struttura del linguaggio. Voglio solo strappare parole a parte inutili e tenere solo quello che sono interessanti.
E 'più come se avessi un tokeniser e ha chiesto il parser "Ok, leggere il flusso fino a trovare un soggetto, quindi ignorare il resto fino a trovare un verbo, ecc .."
Ho bisogno di estrarre una struttura organizzata in un set non-organizzato ... Per esempio, mi piacerebbe essere in grado di interpretare (non sto a giudicare la pertinenza di questa visione del tutto semplice ed errata di 'grammatica inglese')
SUBJECT - VERB - INDIRECT OBJECT
INDIRECT OBJECT - SUBJECT - VERB
così sarò analizzare frasi come
It's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV
o
It's 10PM and, on the SOFA in front of the TV, the Lazy CAT is currently SLEEPING heavily
Soluzione
Si potrebbe creare solo un paio di regole di lexer (quelli che hai postato, per esempio), e come ultima regola lexer, si poteva competere con qualsiasi personaggio e skip()
esso:
VERB : 'SLEEPING' | 'WALKING';
SUBJECT : 'CAT'|'DOG'|'BIRD';
INDIRECT_OBJECT : 'CAR'| 'SOFA';
ANY : . {skip();};
L'ordine è importante: i tentativi lexer per abbinare i token da cima a fondo, quindi se non può adattarsi a qualsiasi dei gettoni VERB
, SUBJECT
o INDIRECT_OBJECT
, essa "cade attraverso" alla regola ANY
e salta questo token . È quindi possibile utilizzare queste regole parser per filtrare il flusso di ingresso:
parse
: sentenceParts+ EOF
;
sentenceParts
: SUBJECT VERB INDIRECT_OBJECT
;
che analizzare il testo di input:
E '22:00 e il Lazy CAT è al momento PERNOTTAMENTO pesantemente sul divano davanti alla TV. Il DOG sta camminando sul divano.
come segue: