Qual è il nome di una grammatica che può cambiare il suo tokenizer a metà analisi?

-3

Stavo creando una lingua e ho scoperto che il mio tokenizzatore della lingua avrebbe dovuto cambiare a seconda della fase di analisi.

vale a dire. abc[1] verrebbe analizzato come 4 token ( abc , [ , 1 , ] ), dove { abc[1] } verrebbe analizzato come 3 ( { , abc[1] , } ) .

Una grammatica che cambierebbe il suo significato di tokenizer a metà analisi è definita da qualche parte? Una grammatica definisce anche una cosa del genere o è irrilevante per la grammatica e non viene realmente eseguita a livello di parser?

    
posta Adrian 16.05.2013 - 00:39
fonte

2 risposte

3

Non c'è un nome speciale per questo tipo di grammatica che io conosca. Quello che hai è ancora una grammatica LR (k) che può essere analizzata da un parser che prende ogni carattere per essere un token, e ha k caratteri di lookahead.

La divisione del parsing in tokenization e il riconoscimento della sintassi deriva dal desiderio di aumentare l'efficienza riducendo il lookahead a 1 simbolo. (Questo e il fatto che un token è un concetto nella sintassi di un linguaggio di programmazione, quindi perché non avere una rappresentazione corrispondente nell'implementazione del linguaggio.)

Vale a dire, il principale vantaggio tecnico dell'analisi dei token piuttosto che dei caratteri è che possiamo distinguere interface e integer con un simbolo di lookahead anziché tre simboli di lookahead.

    
risposta data 16.05.2013 - 04:36
fonte
2

I tokenizer separati sono un dettaglio di implementazione dei parser. Non sono necessari tokenizer separati; è possibile creare parser senza tokenizer separati.

Tuttavia, i tokenizer separati sono spesso usati nella pratica e, quando lo sono, i token vengono spesso definiti usando (reale) regolare espressioni.

Se utilizzi un tokenizzatore separato, potresti trovare difficile o impossibile passare a tokenizer nel corso di un'analisi. Tuttavia, non ci sono problemi teorici con questo, solo tecnologico: se si sceglie la tecnologia giusta, in realtà è abbastanza facile da fare.

Quindi, per rispondere alle tue domande specifiche:

  • "Una grammatica che cambierebbe il suo tokenizer a metà analisi è stata definita da qualche parte?" Questo può accadere con la composizione del linguaggio. I tokenizer separati e regolari non interagiscono bene con la composizione del linguaggio.
  • "Una grammatica definisce anche una cosa del genere o è irrilevante per la grammatica e non viene realmente eseguita a livello di parser?" La tokenizzazione fa parte di una grammatica, quindi sì, una grammatica è libera di dettare come avviene la tokenizzazione a seconda della regola che sta tentando di analizzare. Tuttavia, potresti non vederlo spesso nella pratica. In genere, almeno nella mia esperienza, la tokenizzazione è regolare e non contestuale o sensibile al contesto.
risposta data 16.05.2013 - 20:27
fonte

Leggi altre domande sui tag