Rimozione della ricorsione sinistra in grammatica mantenendo l'associazione sinistra dell'operatore


13

Ho un problema con questo esercizio:

Sia G la seguente ambigua grammatica per il calcolo λ:

E → v | λv.E | EE | (E)

dove E è il singolo simbolo non terminale, λv.E rappresenta l'astrazione rispetto alla variabile v in E ed EE rappresenta l'applicazione.

  1. Definire una grammatica LL (1) G ′ tale che L (G ′) = L (G) e l'ambiguità di G sia risolta imponendo le seguenti convenzioni usuali:
    1. l'astrazione è associativa giusta;
    2. l'applicazione è lasciata associativa;
    3. l'applicazione ha una priorità maggiore rispetto all'astrazione.
  2. Mostra la tabella di analisi LL (1) per G ′ e l'albero di analisi ottenuto durante l'analisi della stringa λv1. λv2. v1v2v1.

Ho eliminato l'ambiguità impostando la precedenza e l'associazione, ottenendo questa grammatica:

E -> EF | F
F -> λv.G | G
G -> (E) | v

che non è LL (1), poiché la produzione E -> EFviene lasciata ricorsiva. Tuttavia, eliminando la ricorsione sinistra da quella produzione ottengo:

E -> FE¹
E¹-> FE¹ | ɛ
F -> λv.G | G
G -> (E) | v

non conforme al requisito 1.2.

Ho cercato una soluzione su Internet, ma sembra che non sia possibile eliminare la ricorsione di sinistra preservando l'associatività di sinistra.

Tuttavia, questo esercizio è apparso sull'esame dei compilatori alcuni anni fa, quindi ci deve essere una risposta corretta.

Grazie per l'aiuto.

Risposte:


11

Compatibilità dell'associatività sinistra e analisi LL (1)

Hai appena colto una delle principali incongruenze nell'uso della sintassi senza contesto (CF). Le persone vogliono scegliere le grammatiche in modo che l'albero di analisi rifletta la struttura prevista della frase, vicino alla sua semantica, specialmente nel caso di operatori non associativi, come l' applicazione . Questo era praticamente l'intento originale delle grammatiche CF in linguistica. Ma allo stesso tempo si stanno limitando ad analizzare la tecnologia che tollererà solo alcuni tipi di grammatiche.

Infatti, se l'albero di analisi deve riflettere l'associatività sinistra di un operatore, allora la grammatica è necessariamente ricorsiva a sinistra, poiché il nodo di applicazione superiore nell'albero di analisi sta necessariamente aggiungendo il termine più a destra delle applicazioni successive non paresizzate. Quindi l'analisi di LL è fuori discussione. Hai ragione.

Ci sono due modi per uscirne. Non si deve fare affidamento sul parser per fornire il "parse-tree" rigido da utilizzare per le fasi successive dell'elaborazione (come la riduzione dell'espressione lambda, qui). Ciò ha portato al concetto di alberi di sintassi astratti (AST) che possono essere costruiti dall'albero di analisi, ma con una struttura diversa.

L'altra soluzione consiste nell'utilizzare tecniche di analisi più generali che accetteranno qualsiasi grammatica CF e analizzeranno in accordo con essa. I parser CF generici sono una tecnologia ben sviluppata (e non smetto di chiedermi perché LL rimanga così popolare).

Non ho idea di cosa possa essere considerata una risposta adeguata a questi requisiti contraddittori.

Quello che vorrei fare è mostrare che sono requisiti contraddittori. Fornisci una prima grammatica che soddisfi i vincoli di associatività e priorità, quindi trasforma la grammatica in e la grammatica LL (1) per l'analisi.

Il fatto che qualcosa sia apparso su un diario o su un esame non è una garanzia totale che sia corretto. E potrei anche sbagliarmi ... ma ho fatto qualche controllo, oltre alla mia conoscenza del problema.

Su questo esempio specifico

Detto questo, la prima grammatica che stai suggerendo non sembra del tutto corretta. Non ha un modo di produrre λu.λv.v.

Un trucco da sapere è iniziare con gli operatori (qui astrazione o applicazione) con la priorità più bassa (astrazione). È lo stesso per le espressioni aritmetiche.


Grazie mille per il tuo commento dettagliato. Hai ragione, ho fatto un errore con la prima grammatica, grazie anche per questo. Chiederò al professore allora.
Marco DallaG,

Potrei aggiungere alla risposta, con una piccola nota sulla progettazione grammaticale per i manichini (anche io), se sei interessato. Inoltre, dicci cosa dice il tuo professore al riguardo.
babou,

Aggiornerò il thread quando il professore risponderà a questa domanda. Comunque, sentiti libero di aggiungere ulteriori informazioni se questo non è un problema per te, ovviamente lo apprezzerei molto. Grazie ancora per il tuo aiuto
Marco DallaG,

@MarcoDallaG Mi sono imbattuto in questo quando ho lavorato su TAPL di Pierce. Il tuo professore ha detto qualcosa di diverso da questa risposta? :)
lcn

0

Il mio tentativo:

E  -> A | λv.E
A  -> FA'
A' -> A | ɛ
F  -> (E) | v

Questa grammatica è LL (1) e dovrebbe rispettare le proprietà richieste.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.