2017-03-13 4 views
0

私のタスクはFIRSTを計算し、次の文法のためのセットに従うことです設定します。

P ::= S CS . 
S ::= (int , int) 
CS ::= C CS | epsilon 
C ::= left int | right int | low C 

I得た後の最初のセット:私は計算し、次のセットの場合

FIRST(S) = {'('} 
FIRST(C) = {left,right,low} 
FIRST(CS) = {left,right,low,epsilon} 
FIRST(P) = FIRST(S) = {'('} 

FOLLOW(P) = $ (or empty) 
FOLLOW(C) = {left,right,low,'.'} 
FOLLOW(CS) = {'.'} 
FOLLOW(S) = {left,right,low} 

私は最初のフォローセットジェネレータを使って試してみましたが、私がフォロー(S)で得たものはでした。ジェネレータの解決策は正しいのですか?なぜですか?私は式を使って解を計算しました:FOLLOW(S) = FIRST({left,right,low} concat FOLLOW(P)) = {left, right, low}。誰かがなぜ私の/ジェネレータの解決策が正しくないのかを説明し、私は他のものがすべて正しいかどうかを確認できますか?私はまた、なぜ私がintを最初に持っていないか知っていますか、それとも後でとにかくパーサーを構築しても問題ないでしょうか。ありがとう

答えて

1

フォローセットを計算するときは、空のプロダクションに注意する必要があります。この場合

CSSP → S CS ..が続くかもしれないことを意味し、空の生産を持っています。同様に、C CSCのでC.

intを続けることができ、生産の最後にあるかもしれないだけでleftまたはrightトークンの後に表示されます。これは、ノーマリターミナルの初めに現れたり、ノンターミナルの直後に現れたりすることはありません。したがって、FIRSTまたはFOLLOWのいずれのセットにもないことが完全に予想されます。

+0

ありがとうございます:)私は今、FIRSTとFOLLOWのセットがどのように機能するかを完全に理解していると思います。私はもう1つだけの質問があります。これらのルールに従うと、フォローセットを決定する方法は、私は ''を含むルールを見ることができません。私のFOLLOW(S)セットに...このような空のプロダクションについては注意しなければならないのでしょうか、それとも実際にこれを決定するルールがありますか? – Luki

+1

私の答の第2段落、「P→S CS」で指定したルールです。 CSが空の場合、その直後にドットが続きます。あるいは、あなたが意味することを理解できないかもしれません。非終端記号のFOLLOW集合は、その非終端記号のインスタンスの後に次の入力の次に来るトークンの集合です。 – rici