LR ファミリーの構文解析ジェネレーター (YACC、BISON など) の文法規則を考えてみましょう。
Nonterminal : [ lookahead not in {Terminal1, ..., TerminalN} ] Rule ;
制限があることを除いて、これは通常のルールです。このルールで作成されたフレーズは、で始まることはできませんTerminal1, ..., TerminalN
。(確かに、この規則は一連の通常の規則に置き換えることができますが、より大きな文法になります)。これは、競合を解決するのに役立ちます。
問題は、そのような制限を受け入れる LR テーブル構築アルゴリズムの修正があるかどうかです。そのような変更が可能であるように私には思えます(優先関係のように)。
確かに、実行時にチェックできますが、コンパイル時のチェックを意味します ( yacc 互換ジェネレーターの%prec
、%left
、%right
およびディレクティブなどの解析テーブルの作成中に実行されるチェック)。%nonassoc