Antlr y reglas recursivas a la izquierda

Estoy tratando de escribir una gramática usando ANTLR, pero no puedo entender cómo funciona antlr con opciones recursivas.

Leí muchos artículos y foros, pero no puedo resolver mi problema...

Aquí hay una pequeña parte de mi gramática:

grammar MyGrammar;

ComponentRef :
    IDENT ('[' Expression (',' Expression)* ']')?
;

Expression:
    ComponentRef ('(' FunctionArguments ')')?
;

FunctionArguments:
    Expression (',' Expression)*
;

IDENT: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;

Todavía no entiendo por qué no funciona... ¡no hay ambigüedad! ¿no es así?

Aquí hay algunos ejemplos de código con los que debería funcionar mi gramática:

a
a[b,c]
a[b[c], d]
func(a)
func(a,b,c)
func[a](b,c)
func(a[b], c[d])
func[a](b[c])

¡Gracias por adelantado!

preguntado el 12 de junio de 12 a las 10:06

2 Respuestas

Primero, asegúrese de entender reglas de lexer y parser. También lea el Megatutorial de ANTLR.

El código solo usa reglas lexer, que no funcionarán. Aunque incluso las reglas de lexer puede ser recursivos (en las gramáticas ANTLR), es mejor evitarlos. Más bien, la mayoría de las reglas deberían ser reglas de analizador:

componentRef :
    IDENT ('[' expression (',' expression)* ']')?
;

expression:
    componentRef ('(' functionArguments ')')?
;

functionArguments:
   expression (',' expression)*
;

IDENT: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;

La gramática anterior no reconocerá la entrada que ha publicado, pero ya no hay errores. Una gramática que reconozca la entrada que ha publicado, podría verse así (¡no probada!) gramática:

parse
 : expr* EOF
 ;

expr
 : IDENT (index | call)*
 ;

index
 : '[' expr_list ']'
 ;

call
 : '(' expr_list ')'
 ;

expr_list
 : expr (',' expr)*
 ;

IDENT
 : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
 ;

SPACE
 : (' ' | '\t' | '\r' | '\n')+ {skip();}
 ;

contestado el 02 de mayo de 21 a las 01:05

Supongo que sus Expresiones de capitolio son un error. Probablemente quisiste escribir en minúsculas.

¿Cómo puedes decir que no hay ambigüedad? las expresiones llaman a argumentos de función, los argumentos de función llaman a expresiones. -1

Respondido 14 Feb 18, 19:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.