Pregunta

Estoy muy nuevo en el mundo antlr y estoy tratando de averiguar cómo puedo usar esta herramienta de análisis para interpretar un conjunto de cadena "ruidoso". Lo que me gustaría lograr es la siguiente.

Tomemos por ejemplo esta frase: It's 10PM and the Lazy CAT is currently SLEEPING heavily on the SOFA in front of the TV

Lo que me gustaría es que el extracto de CAT, SLEEPING y SOFA y tienen una gramática que coincidir fácilmente el siguiente patrón: ASUNTO - VERBO - objeto indirecto ... donde podría definir
VERB : 'SLEEPING' | 'WALKING';
SUBJECT : 'CAT'|'DOG'|'BIRD';
INDIRECT_OBJECT : 'CAR'| 'SOFA';

etc .. No quiero que termina con una "NoViableException" permanente ya que no puedo describir todas las posibilidades alrededor de la estructura del lenguaje. Sólo quiero romper palabras aparte inútiles y sólo mantener la que son interesantes.

Es más como si tuviera una tokenizador y pidió el analizador "Ok, leer la secuencia hasta que encuentre un sujeto, entonces ignorar el resto hasta que encuentre un verbo, etc .."
Necesito extraer una estructura organizada en un conjunto no-organizada ... Por ejemplo, me gustaría ser capaz de interpretar (No estoy juzgando la pertinencia de este punto de vista completamente básica e incorrecta de 'gramática Inglés')
SUBJECT - VERB - INDIRECT OBJECT
INDIRECT OBJECT - SUBJECT - VERB
así que voy a analizar frases como
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

¿Fue útil?

Solución

Se puede crear sólo un par de reglas analizadoras (los que posteaste, por ejemplo), y como última regla léxico, que podría coincidir con cualquier carácter y skip() que:

VERB            : 'SLEEPING' | 'WALKING';
SUBJECT         : 'CAT'|'DOG'|'BIRD';
INDIRECT_OBJECT : 'CAR'| 'SOFA';
ANY             : . {skip();};

El orden es importante en este caso: los intentos analizadoras para que coincida con las fichas de arriba a abajo, por lo que si no puede coincidir con cualquiera de los tokens VERB, SUBJECT o INDIRECT_OBJECT, se "cae a través de" la regla ANY y se salta este token . A continuación, puede utilizar estas reglas del analizador para filtrar el flujo de entrada:

parse
  :  sentenceParts+ EOF
  ;

sentenceParts
  :  SUBJECT VERB INDIRECT_OBJECT
  ;  

que analizar el texto de entrada:

  

Es 22:00 y el perezoso gato está durmiendo actualmente    en gran medida en el sofá delante de la televisión. El PERRO    está caminando en el sofá.

como sigue:

text alt

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top