Estoy usando ANTLR 4.9.2 para analizar una gramática que representa instrucciones de ensamblaje.
grammar IrohAsm; main: line* | EOF; line: (rangedec | instruction | comment)? EOL; instruction: MNEMONIC firstoperand COMMA secondoperand; rangedec : range assignment?; firstoperand : range | mem | REGISTER; secondoperand : range | mem | IMM | REGISTER; range : IDENTIFIER OPENBRACKETS IMM CLOSEDBRACKETS; assignment : EQUALS OPENCURL IMM (COMMA IMM)* CLOSECURL; mem : AT IMM; comment : '#' ~EOL*; WHITESPACE : (' ') -> skip ; // remember to append \n to input EOL : '\n'; OPENCURL : '{'; CLOSECURL : '}'; OPENBRACKETS : '['; CLOSEDBRACKETS : ']'; COMMA : ','; EQUALS : '='; AT : '@'; MNEMONIC : ('jmp' | 'add' | 'sub' | 'jez' | 'mov' | 'wrt' | 'get'); REGISTER: ('ab' | 'bb' | 'cb' | 'db'); IMM : DIGITS RADIX?; RADIX : ('d' | 'b' | 'h'); DIGITS : [0-9]+; IDENTIFIER: ([a-zA-Z0-9] | '$' | '_' | '\u00C0'..'\uFFFF')+ ;La gramática funciona bien, pero genera árboles como el siguiente;

cuando se le da la siguiente entrada:
mov ab,abComo puede ver, COMMA se incluye como uno de los elementos secundarios de la instrucción. Su ubicación es importante para el idioma, pero realmente no me importa después del análisis. ¿Hay alguna manera de que pueda dejarlo fuera del árbol final por completo? Y si es así, ¿sería esto un cambio en la gramática o en mi código para analizar el árbol?

Mi código actual para obtener el árbol:
CharStream inputStream = CharStreams.fromFileName("src/test/assembly/cool.asm"); IrohAsmLexer lexer = new IrohAsmLexer(inputStream); IrohAsmParser parser = new IrohAsmParser(new CommonTokenStream(lexer)); ParseTree parseTree = parser.main();Su pregunta se reduce a: "¿cómo puedo convertir mi árbol de análisis en un árbol de sintaxis abstracta?". La respuesta simple a eso es: "no puedes" :). Al menos, no usar un mecanismo ANTLR incorporado. Tendrá que recorrer el árbol de análisis (utilizando el mecanismo de visitante o oyente de ANTLR) y construir su AST manualmente.
La función para crear AST más fácilmente a partir de un árbol de análisis a menudo aparece en el repositorio de Github de ANTLR:
así como en stackoverflow:
Para ANTLR, como dice Bart, no puedes hacerlo sin hacerlo tú mismo. Esencialmente, debe escribir un código personalizado para recorrer el CST y construir un AST personalizado.
No tiene que ser de esta manera. Puede construir generadores de analizadores que construyan automáticamente árboles que:
El resultado da algo muy parecido a los AST clásicos sin ningún esfuerzo manual; los árboles resultantes suelen tener entre un 30 y un 50 % del tamaño de los CST de los que se derivan automáticamente.
Esto importa cuando
Proporcionaría el nombre de la herramienta que hace esto que diseñé y construí, pero algunas personas odian cuando lo hago. Puedes consultar mi perfil.
Para cualquiera que esté atascado en esto, la respuesta de Bart Kiers es un gran punto de partida, algunos recursos que encontré que explican bien los patrones de Oyente/Visitante son: