2010-11-12 13 views
6

A prima vista, il shunting yard algorithm sembra applicabile all'analisi delle espressioni regolari POSIX, ma poiché non ho molta esperienza (o background teorico) nella scrittura dei parser, vorrei chiedere SO prima di saltare e scrivere qualcosa solo per ottenere bloccato a metà strada.L'algoritmo dello shunting può analizzare le espressioni regolari POSIX?

Forse una versione più sofisticata della domanda è: qual è una buona affermazione formale della classe di problemi a cui può essere applicato l'algoritmo dello shunting yard?

Chiarimento: Questa domanda è se è possibile analizzare POSIX ri sintassi in un albero di sintassi astratta utilizzando i principi di base dell'algoritmo di manovra, non è se è possibile utilizzare le espressioni regolari per implementare l'algoritmo di smistamento. Mi spiace di non essere stato abbastanza chiaro affermando che per cominciare!

+0

Quando parli di analisi di un'espressione regolare, intendi la tokenizzazione della stringa che descrive il linguaggio normale? O intendi l'esecuzione dell'automa a stati finiti che rappresenta? O qualcos'altro? – Gabe

+0

Intendo costruire un AST che rappresenta l'espressione regolare. La conversione di AST in un automa per far corrispondere la regex è un altro problema, lo so. –

risposta

0

Dirò che la risposta alla tua domanda è "no, non è possibile implementare l'algoritmo dello shunting utilizzando un'espressione regolare". Questo è per lo stesso motivo per cui non è possibile analizzare codice HTML arbitrario utilizzando espressioni regolari. Il che si riduce a questo:

Le espressioni regolari non hanno uno stack. Poiché l'algoritmo dello shunting yard si basa su uno stack (per eseguire il push e il pop degli operandi durante la conversione da infisso a RPN), le espressioni regolari non hanno il "potere" computazionale per eseguire questa attività.

Questo glossa molti dettagli, ma una "espressione regolare" è un modo per definire un linguaggio normale. Quando "usi" un'espressione regolare, chiedi al computer di dire: "Guarda un corpo di testo e dimmi se alcune di queste stringhe sono nella mia lingua, la lingua che ho definito usando un'espressione regolare". Indirizzerò a this most excellent answer which you and everyone reading this should upvote per ulteriori informazioni sulle lingue regolari.

Quindi ora è necessario un concetto matematico per aumentare "lingue regolari" al fine di creare linguaggi più potenti. Se dovessimo caratterizzare l'algoritmo dello shunting yard come una realizzazione di un modello di potenza computazionale, potreste dire che l'algoritmo sarebbe descritto come context-free grammar (ehi, sapete, quel link usa un albero di analisi delle espressioni come esempio.) A push-down automata. Qualcosa con una pila.

Se non hai familiarità con la teoria degli automi e le classi di complessità, allora quegli articoli di Wikipedia non sono probabilmente così utili senza spiegarli da zero.

Il punto è che si può essere in grado di utilizzare regex per aiutare a scrivere lo scalo di smistamento. Ma le regex non sono molto buone nel fare operazioni che hanno una profondità arbitraria, che questo problema ha. Quindi non passerei troppo tempo a percorrere il viale regex per questo problema.

+3

Penso che tu abbia letto male la mia domanda. Non sto chiedendo di implementare il cantiere di smistamento con le espressioni regolari. Sto chiedendo se è possibile analizzare un'espressione regolare (in un AST) utilizzando una variante dell'algoritmo di smistamento. –

+3

Indipendentemente da ciò, hai scritto una bella risposta, anche se a una domanda diversa, quindi spero che tu non la cancelli semplicemente! –

+0

doh, mi dispiace per quello! – poundifdef

0

Non vedo perché non sarebbe adatto. Guardando un vecchio codice, sembra che ho usato una strategia di parsing completamente diversa per il mio parser regexp, tuttavia (essenzialmente, un walk-through dall'inizio, costruendo la rappresentazione dell'automa risultante mentre si va, con qualche look-ahead e ricorsivo chiama per implementare il raggruppamento di espressioni regolari).

2

Sono abbastanza sicuro che sia possibile. Se si guarda al normale pacchetto di espressione di Henry Spencer:

regexp.shar.Z

che era alla base per le espressioni regolari del Perl, si noterà che egli descrive il programma come in "ferrovia forma normale".

+0

Grazie, darò un'occhiata. –

0

Suppongo che avresti qualche problema perché caratteri diversi hanno significati diversi in contesti diversi, ad es.

^[^a-z][asd-] 

Il ^ ha due significati diversi e così fa il -. Penso che sceglierei un parser di discesa ricorsivo.

+0

Questo è quello che pensavo all'inizio, ma se è possibile determinare in modo efficiente il contesto dallo stato stack/code, trattare questi speciali non dovrebbe essere un grosso problema, giusto? –

+0

A proposito, '[^ a-z]' e '[asd-]' sono entrambi token individuali. Non c'è motivo di trattarli come qualcosa di più complesso a livello di parser. Hanno la possibilità di essere speciali quando arriva il momento di costruire la FA. –

+0

@ R .. Non sto dicendo che sia impossibile o anche molto difficile, ma non appena ti ritrovi a dover camminare nello stack, probabilmente stai andando nella direzione sbagliata. Penso solo che sarebbe più pulito come un parser di discesa ricorsivo. – JeremyP

Problemi correlati