2016-10-29 17 views
1

単純な再帰的降下構文解析プログラムを作成することで、パーサーの仕組みを学びます。しかし、私は文法をLL(1)と定義するのに問題があります。 1(LLを使用している場合しかし、これは曖昧につながるLL(1)文法の作成に関する問題

statement: assignent | expression 
assignment: NAME EQUALS expression 
expression: term [(PLUS|MINUS) term] 
term:  NAME | NUMBER 

:この私は、次の文法規則を作成した操作を行うに

a = 1 
a + 1 

:私は、次の2つのステートメントを解析することができるようにしたいです)パーサーのように、NAMEトークンがstatementルールで検出された場合、ルックアヘッドなしでassignmentexpressionかどうかはわかりません。

Pythonの文法はLLです(1)。これは可能ですが、私はそれを行う方法を理解できません。私はPythonの文法規則(https://docs.python.org/3/reference/grammar.html)を見てきましたが、まだ実装しているかどうかはまだ分かりません。

任意の助けをいただければ幸いです:)

+0

LL(1)はルックアヘッドを意味するものではなく、1トークンの先読み(1が出てくるところ)があることを意味します。 NAMEトークンを見つけたら、次のトークンを探します。これはEQUALS、PLUS、またはMINUSトークンになります。そして、この情報に基づいてどのルールを従うべきかを知っています。 – Mephy

+1

私が間違っている場合は私を訂正してください。しかし、単一の先読みがNAMEトークンになると思いましたか? – soarjay

+0

私はコンパイラを学んでから用語が間違っているかもしれませんが、NAMEは現在のトークン(レクサーによって生成されたもの)であり、EQUALS/PLUSは最初の先読みトークンです"覗く"が実際にポップしない)。 – Mephy

答えて

2

をただ非常に低い優先順位の演算子として=を扱います。ただし、(Cのような言語が欲しい場合を除き、=は実際には非常に低い優先順位の演算子です)、内部の(括弧のような)式から除外する必要があります。演算子の優先順位のためのガイドです

expression: factor ['+' factor] 
factor:  term ['*' term] 
term:  ID | NUMBER | '(' expression ')' 

あなただけの乗算と加算を持っていた場合、あなたが使用することができ+への引数は Sを含めることができますので、優先順位が高いです逆も同様です。例えば、

statement: expression ['=' expression] 

残念ながら、それができるようになる:だから私たちはただの割り当てを追加することができ、望ましくない

(a + 1) = b 

を。したがって、それを排除する必要がありますが、文法自体ではなく、制作が受け入れられたときに(最初の形式のチェックで)排除することは可能です。私が理解しているように、それはPythonパーサーがやっていることです。 testとキーワードに関する長いコメントを参照してください。

代わりにLR(1)パーサーを使用した場合、この問題は発生しません。