tutorial mega descargar java antlr grammar

java - descargar - antlr4 mega tutorial



ANTLR: ¿Cómo se puede explicar el comportamiento de esta gramática que reconoce los sufijos de un código Java? (1)

Creo que encontrará que no está retrocediendo de la manera que espera. La razón es que encuentra el {} y luego espera ver un v2_181 , que no encuentra. porque no retrocede, no encuentra la alternativa que desea. La alternativa es hacer que el v2_181 opcional, entonces no necesita el seguimiento. Algo como a continuación:

grammar Java; @parser::members {String ruleName; } start : compilationUnitSuf EOF; compilationUnitSuf : {ruleName = "typeDeclarationSuf"; } s2 ; s2: ''{'' ''}'' v2_81?; v2_81 : {ruleName.equals("enumBodyDeclarationsSuf")}? t173 | t173 ''}''; t173: ''}'' | ''{''*; LBRACKET: ''{''; RBRACKET: ''}''; WS : [ /t/r/n/u000C]+ -> skip ;

Hace una semana comencé el siguiente proyecto: una gramática que reconoce los sufijos de un código Java.

Utilicé la gramática oficial de ANTLR para Java ( Java.g4 ) como línea de base y comencé a agregar algunas reglas. Sin embargo, esas nuevas reglas también introdujeron la recursión de la izquierda con la que también tuve que lidiar.

Después de un par de días de trabajo tuve el siguiente código . Cuando comencé a hacer pruebas noté algo inusual que todavía no puedo explicar. Cuando se proporciona la entrada { } el analizador no viable alternative at input ''<EOF>'' me dice no viable alternative at input ''<EOF>'' pero cuando cambio el orden de los terminales en el lado derecho de la regla s2 , especialmente si cambiamos el lado derecho de v2_1 | v2_2 | v2_3 ... v2_1 | v2_2 | v2_3 ... v2_1 | v2_2 | v2_3 ... a v2_36 | v2_1 | v2_2 ... v2_36 | v2_1 | v2_2 ... v2_36 | v2_1 | v2_2 ... (el terminal v2_36 se mueve a la primera posición), la secuencia { } se acepta.

Lo primero que Antlr fue que Antlr no retrocede porque noté que con la entrada { } la primera versión del analizador comienza a seguir la regla v2_3 y solo informa que no se encuentra nada y no trata de considerar otras opciones (eso es lo que pienso pero tal vez no sea cierto) como v2_36 que da exactamente la respuesta positiva.

Pero, después de algunas investigaciones, descubrí que ANTLR realmente retrocede, pero solo si todo lo demás falla. Al menos esto es cierto para v3.3 (léalo en el documento oficial de ANTLR ), pero creo que también es cierto para v4 . Ahora estoy un poco confundido. Después de pasar tantas horas en este proyecto, me sentiría muy mal si no lo hago funcionar. ¿Alguien puede dar algún tipo de propina o algo? Sería muy apreciado, gracias.

EDITAR

Logró aislar el problema para

grammar Java; @parser::members {String ruleName; } start : compilationUnitSuf EOF; compilationUnitSuf : {ruleName = "typeDeclarationSuf"; } s2 ; s2: ''{'' ''}'' v2_81 | ''{'' ''}''; v2_81 : {ruleName.equals("enumBodyDeclarationsSuf")}? t173 | t173 ''}''; t173: ''}'' | ''{''*; LBRACKET: ''{''; RBRACKET: ''}''; WS : [ /t/r/n/u000C]+ -> skip ;

Entonces, ¿por qué el algoritmo de predicción me sugiere seguir s2 -> v''{'' ''}'' v2_81 -> ... lugar de s2 -> ''{'' ''}'' ?