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