sto usando GNU Bison 2.4.2 per scrivere una grammatica per una nuova lingua su cui sto lavorando e ho una domanda. Quando ho specificare una regola, diciamo:Bison: token facoltativi in una singola regola
statement : T_CLASS T_IDENT '{' T_CLASS_MEMBERS '}' {
// create a node for the statement ...
}
Se ho una variazione sulla regola, per esempio
statement : T_CLASS T_IDENT T_EXTENDS T_IDENT_LIST '{' T_CLASS_MEMBERS '}' {
// create a node for the statement ...
}
Dove (dalle regole scanner Flex):
"class" return T_CLASS;
"extends" return T_EXTENDS;
[a-zA-Z\_][a-zA-Z0-9\_]* return T_IDENT;
(e T_IDENT_LIST è una regola per identificatori separati da virgole).
C'è un modo per specificare tutto questo solo in una regola, impostando in qualche modo "T_EXTENDS T_IDENT_LIST" come facoltativo? Ho già provato con
T_CLASS T_IDENT (T_EXTENDS T_IDENT_LIST)? '{' T_CLASS_MEMBERS '}' {
// create a node for the statement ...
}
Ma Bisonte mi ha dato un errore.
Grazie
Questa era la soluzione per scrivere una sola regola senza il | :) Grazie! –
Non ha nulla a che fare con LALR (1), poiché entrambi sono LALR (1). È perché la sintassi di input è BNF e non EBNF. –
@ChrisDodd: Siamo spiacenti, ma sbagliato. Il problema qui è che mentre lo scriveva, il suo parser avrebbe dovuto guardare avanti tre simboli, attraverso T_CLASS e T_IDENT per vedere se il prossimo simbolo era un '{' o T_EXTENDS per vedere quale variazione 'statement' usare. Questo sta violando LALR (1). EBNF mi sembra un'arma rossa completa - non vedo nulla che assomigli a EBNF ovunque nella domanda. –