2017-01-26 2 views
2

den Block wie diese Das Element der beiden Aussagen sind gegenseitig mit peg.js referenzierten

compound_stat 
= '{' decl exp_stat '}' 

exp_stat 
= exp ';' 

decl 
= decl_specs id ';' 

decl_specs 
= 'int'/'float' 

id 
=name:[a-z]+ {return name.join("");} 

exp_stat 
    = left:multiplicative "+" right:exp_stat { right=right+1;return left + right; } 
/multiplicative 

multiplicative 
    = left:primary "*" right:multiplicative { return left * right; } 
/primary 

primary 
    = integer 
    /id 
/"(" exp_stat:exp_stat ")" { return exp_stat; } 


integer "integer" 
    = digits:[0-9]+ { return parseInt(digits.join(""), 10); } 

wollen

definieren, um das erreichen {float a = 3 ist, A * 3 + 1;} return i Ich weiß nicht, wie ich die ID in zwei Anweisungen referenzieren soll, die "decl" und "exp_stat" sind. Wer kann ein Beispiel geben?

+0

Wissen Sie, dass Sie zwei verschiedene Regeln namens 'exp_stat' haben? –

+0

Ich machte einen Fehler. Es sollte exp sein – freyone

Antwort

1

Die kurze Antwort ist, dass Sie Ihre deklarierten Variablen definieren, intern und schließlich Referenzieren müssen.

Wenn Sie also sagen: 'int a = 1;', möchten Sie diesen Wert irgendwo speichern (intern), damit Sie ihn abrufen können, wenn Sie ihn woanders brauchen.

Zum Glück für uns, unterstützt pegjs "global" Codeabschnitte, in denen Sie genau das tun können, wie in:

{ 
    /** 
    * Storage of Declared Variables 
    * @type {Object} 
    */ 
    const vars = {} 
} 

Dann, wenn Ihr Parser erkennt eine gültige Erklärung, Sie:

vars[id] = { name: id, type: spec, value: val } 

/* where id is the name (symbol) of your declared variable: 'a' 
    spec is the value of your decl_spec: 'float' 
    and val is the value you want to intern 
*/ 

Schließlich, wenn Sie den Wert benötigen, erkennen Sie das Symbol in einem Ausdruck und tun Ihre Ersetzung, wie Sie den Ausdruck auswerten.

Das vollständige Arbeitsbeispiel finden Sie unter this gist, die einen voll funktionsfähigen Parser für Ihre Sprachspezifikation bietet.

Verwandte Themen