4

Bison を使用して Javascript パーサーを実装しています。ECMAScript 仕様には、次のように記載されています。

ExpressionStatement:
    [lookahead ∉ { '{' , 'function'}] Expression ;

これにより、BlockStatement (空のステートメント ブロック) としての "{ }" と ExpressionStatement (空のオブジェクト リテラル) としての "{ }" の間のあいまいさが解消されます。

空のステートメント ブロックの例:

if (a > 5) {}

空のオブジェクト リテラルの例:

var a = {};

一部のプロダクションが特定のトークンで開始されるべきではないことを bison/yacc 文法で指定するにはどうすればよいですか? つまり、次のようなものです。

expressionStatement
    : %must-not-start-with('{', TOKEN_FUNCTION) expression ';'
    ;

「ExpressionNotStartingWithOpenCurlyBraceOrFunction」を定義するためにすべての式ルールを複製できることはわかっていますが、それでは文法のサイズが大幅に増加するため、回避しようとしています。

4

1 に答える 1

1

Bison にはそのようなディレクティブはありません。他に 2 つの選択肢があります。1 つは、結果として生じる競合を調査し、優先順位ディレクティブを使用して解決できるかどうかを確認することです ( http://www.gnu.org/software/bison/manual/html_node/Shift_002fReduce.htmlをご覧ください)。もう 1 つの方法は、GLR パーサーの使用に移行し、実行時にあいまいさを解決することです。

該当する場合は、最初のオプションの方がおそらく簡単です。しかし、それはあなたの文法に大きく依存します。

于 2013-06-20T10:12:42.063 に答える