Come ti scrivere un Parsing Expression Grammar in uno dei seguenti generatori Parser (PEG.js, Citrus, Treetop) che può gestire Python/Haskell/CoffeScript stile di rientro:PEG per Python stile di rientro
Esempi di un non-ancora- linguaggio di programmazione esistente:
square x =
x * x
cube x =
x * square x
fib n =
if n <= 1
0
else
fib(n - 2) + fib(n - 1) # some cheating allowed here with brackets
Aggiornamento: Non provare a scrivere un interprete per gli esempi sopra. Mi interessa solo il problema dell'indentazione. Un altro esempio potrebbe essere l'analisi seguente:
foo
bar = 1
baz = 2
tap
zap = 3
# should yield (ruby style hashmap):
# {:foo => { :bar => 1, :baz => 2}, :tap => { :zap => 3 } }
Non ho familiarità con Citrus e Treetop, ma sebbene PEG.js sia uno strumento piccolo e accurato, è troppo corto per questo tipo di interpretazione, IMO. Inoltre, non credo che qualcuno pubblicherà un file grammaticale (abbastanza semplice) (con azioni incorporate) in grado di interpretare tale linguaggio che descrivi poiché c'è un bel po 'di codice coinvolto oltre a definire la grammatica: camminare su AST, salvare i dati in diversi ambiti, risolvendo le variabili negli ambiti e forse anche gli ambiti popping se non si trova una certa variabile in esso. –
P.S. fai la tua domanda in un modo come se tu avessi la risposta. È una vera domanda, o più di un puzzle? Se si tratta di una domanda reale, ti consigliamo di provare [Modelli di implementazione della lingua: crea le tue lingue di programmazione specifiche e di dominio generale] (http://www.pragprog.com/titles/tpdsl/language-implementation-patterns). spiega anche come un linguaggio come Python può essere interpretato (almeno la parte "indent-sensitive", cioè). –
Ciao Bart, grazie per il link al libro. Sfortunatamente non ho la risposta. Sono consapevole che creare un interprete per una lingua come indicato negli esempi sopra non è banale, ma non è quello che mi aspetto qui. Mi interessa solo la parte su come si gestirà la parte/problema di rientro del parsing. Sono infatti in grado di scrivere un parser scritto a mano che tiene traccia dei livelli di indentazione, ma in qualche modo fallisco miseramente per mappare il concetto sui PEG. Qualsiasi aiuto è apprezzato. Matt – Matt