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

È stato utile?

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:

alt text

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top