estoy usando GNU Bison 2.4.2 para escribir una gramática para un nuevo idioma en el que estoy trabajando y tengo una pregunta. cuando especifico regla, digamos:Bison: tokens opcionales en una sola regla
statement : T_CLASS T_IDENT '{' T_CLASS_MEMBERS '}' {
// create a node for the statement ...
}
Si tengo una variación de la regla, por ejemplo
statement : T_CLASS T_IDENT T_EXTENDS T_IDENT_LIST '{' T_CLASS_MEMBERS '}' {
// create a node for the statement ...
}
Dónde (de reglas analizador de flex):
"class" return T_CLASS;
"extends" return T_EXTENDS;
[a-zA-Z\_][a-zA-Z0-9\_]* return T_IDENT;
(y T_IDENT_LIST es una regla para identificadores separados por comas).
¿Hay alguna manera de especificar todo esto solo en una regla, estableciendo de alguna manera el "T_EXTENDS T_IDENT_LIST" como opcional? Ya he probado con
T_CLASS T_IDENT (T_EXTENDS T_IDENT_LIST)? '{' T_CLASS_MEMBERS '}' {
// create a node for the statement ...
}
Pero bisonte me dio un error.
Gracias
Esa fue la solución para escribir solo una regla sin | :) ¡Gracias! –
No tiene nada que ver con que sea LALR (1), ya que ambos son LALR (1). Es porque la sintaxis de entrada es BNF no EBNF. –
@ChrisDodd: Lo siento, pero está mal. El problema aquí es que, mientras lo escribía, su analizador tendría que mirar hacia adelante tres símbolos, a través de T_CLASS y T_IDENT para ver si el siguiente símbolo era '{' o T_EXTENDS para ver qué variación de 'declaración' usar. Eso está violando LALR (1). EBNF parece ser un completo hechizo para mí: no veo nada que se parezca al EBNF en ninguna parte de la pregunta. –