次の入力があるとします。
int x = y;
と
int x = y();
LALR(1) 文法でシフト/リデュースの競合を回避する方法はありますか? shift/reduce 競合により、 で削減するy
か、 まで継続するかが決定されてい(
ます。
(これは、変数名が英数字の任意のセットであり、関数呼び出しが括弧が続く任意の英数字のセットであると想定しています。)
次の入力があるとします。
int x = y;
と
int x = y();
LALR(1) 文法でシフト/リデュースの競合を回避する方法はありますか? shift/reduce 競合により、 で削減するy
か、 まで継続するかが決定されてい(
ます。
(これは、変数名が英数字の任意のセットであり、関数呼び出しが括弧が続く任意の英数字のセットであると想定しています。)
(
関数呼び出しでなくても、識別子の直後に が続く可能性がない限り、これは shift-reduce 競合ではありません。通常はそうではありませんが、C 派生言語では、キャスト式(type)(value)
と括弧で囲まれた関数呼び出しを区別するという問題があります(function)(argument)
。
文法がその特定の C の奇抜さを示さない場合、LALR (1)文法は、 (1)トークンの先読みに基づいて、シフトと縮小のどちらかを決定できます。先読みトークンが a の場合(
、識別子をシフトします。そうしないと、減少する可能性があります。