Considera un parser LALR (1) per un formato file che consente numeri interi e numeri in virgola mobile.
Come al solito, qualcosa come 42
deve essere un numero intero valido e un valore float valido (con una certa conversione automagic in background).
Potrebbero esserci regole di analisi in cui è previsto un numero in virgola mobile o un numero intero e sono previste altre regole in cui solo un numero intero, ad esempio:
foo1
: bar FLOAT buzz
| bar INT buzz
;
foo2
: some INT other stuff
;
Ora considera qualcosa come
foo3
: bar FLOAT xyz FLOAT abc FLOAT buzz
;
ma in ciascuna posizione in questa regola, anziché FLOAT
, è consentito anche INT
.
-
Trasformare questa regola in 8 regole (una regola per ogni combinazione di
FLOAT
eINT
) non è un'opzione. (Considera una regola con 4 o 5 numeri ...) -
Utilizzo di una regola come
float_or_int : FLOAT | INT;
non aiuterà, perché in generale questa regola ridurrà tutto
INT
infloat_or_int
e regole comefoo2
non possono più essere analizzate. (Perché con una grammatica abbastanza grande, l'unico token lookahead non può evitare i conflitti di riduzione dello spostamento derivanti da questa regola.) -
Quando il lexer vede un numero senza un punto decimale, non può decidere se il parser al momento prevede un int o un float o int.
Come può essere gestito in modo elegante?