私は Jison を使用して、変数を含む単純な電卓言語を構築しています。これらの変数を JavaScript と同様に機能させたいと考えています。つまりvar
、最初にキーワードで初期化する必要があります。私の言語では、変数が再初期化された場合にエラーを表示したいと考えています。
var myVar = 4
var myVar = 3
// Error, cannot reinitialise variable myVar on line 2
私の質問は、AST ノードの行番号を取得するにはどうすればよいですか? 私の文法ファイルでは、パーサーからAssignVariable
オブジェクトに行番号を渡すことができますが、これを行うためのより良い方法があるかどうか疑問に思っています。
stmt
: 'PRINT' expr
{ $$ = new yy.Print($2) }
| 'VAR' 'IDENTIFIER' 'ASSIGN' expr
{ $$ = new yy.AssignVariable($2, $4, $3); $$.lineNo = yylineno }
| 'IDENTIFIER' 'ASSIGN' expr
{ $$ = new yy.SetVariable($1, $3, $2) }
;
他のタイプのエラー チェックのために、コンパイラの他のノードの行番号も必要になります。
この質問からのより高レベルのポイントは次のようになります: Jison (または同様のもの) を使用してコンパイル時エラーを検出して処理する最良の方法は何ですか?