Domanda

Recentemente ho scritto un parser in Python utilizzando Strati (è un pitone reimplementazione di yacc).Quando avevo quasi finito con il parser ho scoperto che la grammatica è necessario analizzare mi richiede di fare qualche sguardo durante l'analisi di informare il lexer.Senza fare un cercare di informare il lexer non posso analizzare correttamente le stringhe nel linguaggio.

Dato che posso controllare lo stato del lexer dalle regole di grammatica, penso di risolvere il mio caso d'uso utilizzando una tabella nel parser modulo, ma può diventare troppo difficile da mantenere/test.Quindi voglio sapere di più su alcune delle altre opzioni.

In Haskell, vorrei utilizzare Parsec, una libreria di funzioni di analisi (noto come combinatori).C'è un Pitone attuazione di Parsec?O forse in qualche altra produzione di qualità libreria completa di funzionalità di analisi in modo che posso costruire un contesto sensibile parser in Python?

EDIT:Tutti i miei tentativi di contesto gratuito di analisi hanno fallito.Per questo motivo, non mi aspetto ANTLR essere utile qui.

È stato utile?

Soluzione

Un'opzione che si può prendere in considerazione, se un parser LL è ok per voi, è quello di dare ANTLR una prova, è in grado di generare python troppo (in realtà è LL (*), come il nome, * sta per la quantità di lookahead si può far fronte con).

Altri suggerimenti

Credo che pyparsing si basa sugli stessi principi di parsec.

PySec è un altro monadico parser, non so molto su di esso, ma è la pena di guardare qui

C'è ANTLR, che è LL(*), c'è PyParsing, che è più oggetto amichevole ed è come una sorta di DSL, e poi c'è L'analisi che è come OCaml del Menhir.

Nulla vi impedisce di deviazione del tuo parser "dal contesto libero" percorso utilizzando STRATI.È possibile trasmettere le informazioni per il lexer durante l'analisi, e in questo modo di ottenere la massima flessibilità.Sono abbastanza sicuro che si può analizzare tutto quello che vuoi con STRATI in questo modo.

Per un esempio pratico, considerare - è un parser per l'ANSI C e scritto in Python con STRATI.Si risolve il classico C - typedef identificatore del problema (che fa C grammatica non sensibile al contesto) inserendo i dati in una tabella dei simboli del parser viene usato per il lexer per risolvere simbolo nomi di tipi o non.

ANTLR è grande e ha il vantaggio di lavorare in più lingue.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top