Cosa otterresti se aggiungi parametri a grammatiche libere dal contesto?


13

Stavo pensando alle grammatiche per i linguaggi sensibili alle indendenze e sembra che le grammatiche CF farebbero il trucco se combinate con i parametri. Ad esempio, considera questo frammento per la grammatica Python semplificata in formato simile a ANTLR:

// on top-level the statements have empty indent
program  
    : statement('')+
    ;

// let's consider only one compound statement and one simple statement for now
statement(indent) 
    : ifStatement(indent)
    | passStatement(indent)
    ;

passStatement(indent)
    : indent 'pass' NEWLINE
    ;

// statements under if must have current indent plus 4 spaces
ifStatement(indent)
    : indent 'if' expression ':' NEWLINE (statement(indent '    ')+)
    ;

La mia domanda: questo tipo di grammatiche (CFG con parametri) ha un nome?

Sembra che non sarebbe difficile scrivere un parser di discesa ricorsivo per questa grammatica (i parametri dovrebbero essere fondamentalmente parser). Quali potrebbero essere le difficoltà con questo approccio?

L'aggiunta di parametri aumenta la classe di lingue supportata sopra senza contesto?


1
Se l'insieme di valori che i parametri possono assumere è finito, allora è ancora banalmente privo di contesto (puoi quindi scorrere su tutti i valori e scrivere tutto).
Cricchetto maniaco

1
Vale la pena notare che la proposta è per le lingue sensibili al rientro con rientro fisso. Python (e altri linguaggi simili) non sono limitati in questo modo; accettano qualunque rientro l'utente desideri. Ciò non influisce sulla parseability (tranne che per la gestione dei caratteri di tabulazione) ma sarebbe difficile esprimerlo con la tua proposta, almeno per come la capisco.
rici,


@HendrikJan, le grammatiche degli attributi sono un modo per annotare la grammatica con un'azione semantica, non controllano l'analisi.
Approgrammatore

1
Se l'obiettivo è gestire il rientro, è più adatto al tokenizer piuttosto che al parser. Fai in modo che il tokenizer emetta token INDENT e UNINDENT virtuali quando cambia il livello di rientro. Quindi non è necessario aumentare la grammatica della lingua con informazioni sul rientro.
John Kugelman,

Risposte:


14

Le grammatiche di affisso ( grammatiche senza contesto parametrizzate) sono state ampiamente studiate dall'eminente scienziato informatico olandese Cornelis HA Koster , a partire dal suo articolo del 1962 "Inglese di base, una grammatica generativa per una parte dell'inglese", scritto insieme a LGLT Meertens. Nel 1970, ha prodotto un formalismo del concetto; una utile panoramica è disponibile nel suo documento del 1971 "Affix Grammars for Programming Languages", una versione che ho trovato su Citeseer .

In quel documento, Koster confronta il suo formalismo (e un altro simile) con le grammatiche a due livelli di Van Wijngaarden , e le trova molto simili.

La preziosa bibliografia annotata di Dick Grune sulle tecniche di analisi comprende un gran numero di altri riferimenti utili per grammatiche affisse e altri formalismi non chomskyiani. (Vedi la sezione 18.2.6 della bibliografia, sebbene ci siano articoli utili in altre sezioni.) Grune copre brevemente le grammatiche affisse in §15.3.2 della seconda edizione di Parsing Techniques: A Practical Guide (e ancora più brevemente nella prima edizione , disponibile online) menzionando il fatto che è facile adattare le tecniche di analisi top-down (e altre).

anbncn

Koster, che era anche redattore del rapporto Algol 68, era lo sviluppatore originale del Compiler Description Language (CDL) , basato sulle sue idee sulle grammatiche degli affissi. Questo toolkit e i suoi derivati ​​successivi sono stati utilizzati nella produzione per molti anni. Questa pagina , che ho trovato con una ricerca su Google e la cui permanenza non posso garantire, contiene collegamenti al manuale e al sito di download di CDL3.


Sento che i linguaggi CDL sono più simili alle grammatiche degli attributi : i valori degli attributi possono essere calcolati da funzioni definite esternamente. Mi riserverei il nome grammatica dell'affisso per i casi in cui le relazioni tra i valori degli affissi (attributi) sono definite all'interno del formalismo, come nelle grammatiche degli affissi estesi .
reinierpost,

@reinierpost: hai ovviamente diritto alla tua terminologia; il privilegio non è limitato alle uova antropomorfe. Tuttavia, lo stesso manuale CDL afferma che "CDL3 è un linguaggio di implementazione basato su grammatiche affissi", che ritengo debba essere preso in considerazione. (Manuale disponibile all'indirizzo ftp.cs.kun.nl/pub/cdl3/cdl3-manual-1.2.7.pdf ). Questo è quello che ho affermato nella mia risposta: che CDL era basato sul lavoro di Koster sulle grammatiche degli affissi. Come sottolinea Grune, la differenza tra grammatiche di affisso e di attributo è lieve; la sua distinzione è se gli affissi vengono usati per decidere la validità sintattica.
rici,

(La citazione è dalla prima pagina del manuale.)
rici

Lo so ... e hai ragione. Il mio commento non voleva contraddirti.
reinierpost,

6

Prendi il lemma del pompaggio per i CFG :

Prendi la grammatica

S -> A("")
A(p) -> p 
      | p '\n' A(p"*") '\n' p 

Questo descrive un triangolo stellare:

*
**
***
**
*

uvwxy{uvnwxny|n>0}vx

Ciò significa che il triangolo stellare non è un linguaggio privo di contesto.

O un esempio più semplice:

S-> B("")
B(p)-> p 'a' p 'a' p
     | B(p 'b')

{bnabnabn|n0}


3

Non ho mai visto questo formalismo presentato (nemmeno in qualcosa come quello di Grune Parsing Techniques ), a seconda dei dettagli su come definisci esattamente "i parametri dovrebbero essere fondamentalmente parser" sembra mappabile a van Wijngaarden grammatiche a due livelli, che hanno lo stesso potere di grammatica della struttura di fase senza restrizioni (cioè più potente del sensibile al contesto, potresti scrivere una grammatica VW che fornisce tutti i programmi di arresto).



Koster e il suo gruppo hanno studiato due tipi di grammatiche affisse, per quanto ne so: 1) forme ristrette di grammatiche di Van Wijngaarden, pensate per consentire un più facile riconoscimento; 2) i linguaggi CDL, pratici linguaggi di descrizione del compilatore senza alcuna esplicita manipolazione del valore di apposizione ma con l'opzione di definire le regole nella lingua di destinazione (ad es. Assemblatore), rendendoli Turing completi.
reinierpost,
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.