Come analizzare diversi tipi di numeri con LALR (1)

3

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 e INT ) 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 in float_or_int e regole come foo2 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?

    
posta Martin 08.08.2014 - 09:52
fonte

1 risposta

3

Ciò che viene tipicamente fatto è che la costante numerica è "analizzata" nel lexer, con le informazioni "tipo numero" (int, float, base, ...) rese disponibili al parser. Usi le semplici regole int_or_float nella grammatica e quindi le azioni semantiche associate sono responsabili della verifica della presenza di tipi di numeri legali in ogni posizione e della dichiarazione di un errore in caso contrario.

Il parser apparentemente riuscirà a analizzare il file, ma avrai comunque contrassegnato gli errori, e puoi rifiutare di generare il risultato in base a tali errori.

    
risposta data 08.08.2014 - 14:04
fonte

Leggi altre domande sui tag