2

私はコンパイラの構造を学ぼうとしていて、SLR パーサーに関する Dragon Book の章を読んだところです。そこで、簡単な文法を作成し、パーサーを手作業でコーディングすることにしました。文法は次のようになります。

S -> A
A -> (A)A
A -> e,

e空文字列の生成はどこにありますか。

StackOverflow に関する別の質問によると、開始状態の項目は次のようになります。

S -> .A
A -> .(A)A
A -> .e,

しかし、GOTO 関数はどのように見えるでしょうか。私はそれを知っていGOTO( '(' ) = *some state with A -> (.A)A*ますが、私は本当に頭を包むことができませんGOTO(e). パーサーが空の文字列を見ることは、実際には意味がありません。そうですか?

よろしくお願いします!

マイケル

4

1 に答える 1

0

いいえ、パーサーは空の文字列を認識しません。それが見るのは、入ってくるシンボル (次のトークン) です。入力シンボルが goto アクション (新しい状態への移動) を引き起こさない場合、パーサーは強制的にリダクション (A -> e) を行い、次に A に基づいて goto を実行します (非終端遷移)。

In State:   

A -> '(' . A ')' A
A -> . '(' A ')' A 
A -> e

if the input symbol is not '(', then the parser will make the reduction:

A -> e

and go to the new state:

A -> '('  A . ')' A
于 2013-07-09T20:00:02.143 に答える