Le espressioni regolari sono


16

Se ho una grammatica di tipo 3, può essere rappresentata su un automa pushdown (senza fare alcuna operazione in pila) in modo da poter rappresentare espressioni regolari usando linguaggi senza contesto. Ma posso sapere se una grammatica di tipo 3 è , , , ecc. Senza costruire tabelle di analisi?LR(1)LL(1)SLR(1)

Risposte:


15

Tutte le lingue regolari hanno grammatiche LL (1). Per ottenere una tale grammatica, prendi qualsiasi DFA per il linguaggio regolare (magari eseguendo la costruzione del sottoinsieme sull'NFA ottenuto dall'espressione regolare), quindi convertilo in una grammatica regolare ricorsiva a destra. Questa grammatica è quindi LL (1), perché qualsiasi coppia di produzioni per lo stesso nontermin o inizia con simboli diversi, oppure uno produce ε e ha $ come token lookahead. Di conseguenza, tutte le lingue regolari sono anche LR (1), poiché qualsiasi grammatica LL (1) è LR (1). Inoltre, usando un risultato importante di questo documento , puoi mostrare che qualsiasi lingua LR (1) ha una grammatica SLR (1), il che significa che qualsiasi lingua normale ha una grammatica SLR (1).

Tuttavia, le lingue normali non sono tutte LR (0). Le lingue LR (0) hanno proprietà molto specifiche - in particolare, devono essere prive di prefissi. Quindi la lingua normale {a, aa} non è LR (0), sebbene sia chiaramente regolare (regex a | (aa)). Tuttavia, le lingue LR (0) non sono contenute correttamente nelle lingue normali; questa grammatica per {0 n 21 n | n ≥ 1} è LR (0), ma la lingua non è regolare:

S -> E
E -> 0E1 | 2

Spero che sia di aiuto!


2
Il fatto che le grammatiche regolari regolari accettino esattamente l'insieme delle lingue regolari è di solito fatto in classe (o persino negli esercizi), quindi la risposta è molto più immediata.
Raffaello

2

(Semplicemente vecchia) la sintassi delle espressioni regolari (hai detto "rappresentazione") è LR (0). Non hai bisogno di alcun lookahead per analizzare una stringa che rappresenta una regex. Puoi facilmente decidere eseguendo un generatore di parser su una grammatica per regex: -} Puoi anche facilmente codificare un parser di semplice discesa ricorsiva (LL (0)) per regexps; tutto ciò che è LL (0) è LR (0).

Non so se la sintassi dei cosiddetti "regexps" più complicati come quelli di Perl sia così; ma le regexps di Perl sono strettamente più potenti delle regexps, quindi non sono semplicemente vecchie regexps.

Per determinare se una grammatica ha delle proprietà, è necessario eseguire un tipo di predicato. Per determinare se è (S) LR (k), è necessario eseguire un predicato in grado di verificare la proprietà. In effetti, tale predicato deve in effetti costruire le tabelle di analisi, a causa del modo in cui sono definite.


Le espressioni regolari del Perl funzionano su NFA

La domanda non riguardava il modo in cui funzionavano le regexps del Perl. Si trattava di stabilire se le regexps (Perl?) Fossero analizzabili da determinate tecnologie. Posso credere che i regexps del Perl utilizzino un NFA per fare la loro corrispondenza, insieme ad altre acquisizioni di dati sensibili al contesto, ma non vedo la pertinenza alla domanda.

3
-1 Le espressioni regolari non sono LR (0). Le lingue LR (0) devono essere prive di prefissi, ma l'espressione regolare a|(aa)descrive una lingua che non è priva di prefissi. Inoltre, le lingue LR (0) non possono gestire grammatiche con produzioni epsilon, quindi la lingua normale {epsilon, a} non è LR (0). Tuttavia, le lingue normali sono LL (1) perché puoi scriverle come grammatiche regolari, e quindi sono tutte LR (1). Poiché qualsiasi lingua LR (1) ha una grammatica SLR (1), ciò significa che tutte le lingue regolari sono SLR (1).
templatetypedef

1
Per quanto riguarda LL (0), è il contrario: le lingue LL (0) sono un sottoinsieme corretto delle lingue normali. Nota che LL (0) significa che non usi lookahead per decidere tra diverse derivazioni, il che significa sostanzialmente che non ci sono decisioni e che la lingua è composta da una sola parola. LR (0), al contrario, è una classe utile - di nuovo non si utilizza lookahead per decidere (qui per le riduzioni), ma c'è ancora una certa diversità a causa del fatto che il cambio può distinguere tra diverse produzioni.

1
@ IraBaxter- La sintassi delle espressioni regolari non è LR (0) perché le espressioni regolari non sono prive di prefisso. Non sono neanche LL (0), poiché le lingue LL (0) possono contenere solo una singola stringa (o nessuna stringa).
templatetypedef
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.