2016-10-20 5 views
0

は、私は次の文法を与えられたと仮定があることを、次の文法を操作しますIDENTIFIERはそれぞれの生産の最初の端末です。 2つのルックアヘッドを使用するだけで、パーサがどのパスを取るかを決めることができます。はLL(1)

上記の文法をLL(1)にする方法はありますか?それとも不可能なのでしょうか?

+0

左ファクタリングは検索するのが簡単です。ヒント: 'ステートメント:IDENTIFIER rest;残り:何か| something-else' – rici

+0

@rici私はあなたが[statement - > compound_statement]と[compound_statement - > assignment | function_call]はまだLL(1)と見なされますか? – BDillan

+0

いいえ、そうではありません。 LL(1)にするには、次の(1)のトークンを調べることによってどのプロダクションが拡張されるのかを知る必要があります。次のトークンはIDENTIFIERとなり、 'statement - > compound_statement'を予測することはできますが、2つの' compound_statement'プロダクションのどれを予測することはできません。したがって、LR(1)のようなより強力な解析アルゴリズムを選択するか左揃えにする必要があります。 – rici

答えて

0

上記の文法は、任意のkに対して本当にLL(k)はありませんが、私たちは同じ言語用LL(1)文法構築することができます。私たちにはない、問題の説明では、もちろん

start -> statement // cannot change 

statement -> IDENTIFIER statement0 SEMICOLON 

statement0 -> EQUAL expression 

statement0 -> LPAREN parameters RPAREN SEMICOLON 

を式とパラメータの定義を参照してください。したがって、LL(1)のルールも構築できます(ルールが見えるまでは保証されません)。

関連する問題