3

私はウィキペディアの説明を少なくとも十数回読んだことがありますが、LR(0) パーサーがどのように状態 0 を離れるかについて、いまだに混乱しています。

ウィキペディアの例とその説明では、次のように述べています

'0'パーサーは、初期状態 ( ) だけを含むスタックから開始します。[0]
パーサーが認識する入力文字列の最初のシンボルは です'1'

...しかし、これは私には意味がありません。なぜなら、入力シンボルを見ることは先読みを実行することになりますが、定義により、LR(0)パーサーは先読みを実行できないからです。

パーサーが状態 0 の場合、まだシフトしていないため、スタックにシンボルがありません。
LR(0) パーサーであるため、先読みも実行できません。

では、どのようにテーブルを使用して、状態 0 からどの状態にシフトまたは縮小するかを判断するのでしょうか?

4

1 に答える 1

4

シフトされたシンボルは先読みではありません。消費されています。

LR(0) 文法は、次のシンボルを参照せずに還元することを決定する必要があります。削減しないことを決定すると、暗黙のうちに移行することを決定します。[1]

シフト アクションには、シンボルの読み取り、スタックへのプッシュ、およびアクション テーブルを参照して遷移する状態を決定することが含まれます。

これは LR(k>0) 文法とは異なり、LR(k>0) 文法は先読み記号を使用してシフトと縮小を決定できますが、LR(0) 文法はできません。しかし、どちらも、シフトされたシンボルを読み取った後、どちらの状態に移動するかを決定します。


[注1] ...または、シフトされたシンボルが入力終了マーカーである場合は受け入れますが、それは状態の特殊なケースです。

于 2012-10-27T05:05:33.617 に答える