2017-01-26 5 views
2

は、それが達成したいこの要素は、互いに

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); } 

ようなブロックを定義peg.jsで参照されています"decl"と "exp_stat"の2つのステートメントでidをどのように参照するか分かりません。誰が例を共有することができますか?

+0

あなたは 'exp_stat'という2つの異なるルールを持っていることにご存知ですか? –

+0

私は間違いを犯しました。 – freyone

答えて

1

短い答えは、宣言された変数を定義し、インターンで最終的に参照する必要があるということです。

「int a = 1;」と言うときは、その値を別の場所に必要なときに取得できるように、その値をどこかに保存したいと考えています。私たちのために

ラッキーは、pegjsあなたがのように、まさにそれを行うことが可能な「グローバル」コードセクションをサポートしています。

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

次に、あなたのパーサは、有効な宣言を認識したとき、あなた:

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 
*/ 

最後に、値が必要な場合は、式内の記号を認識し、式を評価するときに置換を行います。

完全に動作する例については、ご使用の言語仕様に完全に対応したパーサーを提供するthis gistを参照してください。

関連する問題