私のタスクは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
を最初に持っていないか知っていますか、それとも後でとにかくパーサーを構築しても問題ないでしょうか。ありがとう
ありがとうございます:)私は今、FIRSTとFOLLOWのセットがどのように機能するかを完全に理解していると思います。私はもう1つだけの質問があります。これらのルールに従うと、フォローセットを決定する方法は、私は ''を含むルールを見ることができません。私のFOLLOW(S)セットに...このような空のプロダクションについては注意しなければならないのでしょうか、それとも実際にこれを決定するルールがありますか? – Luki
私の答の第2段落、「P→S CS」で指定したルールです。 CSが空の場合、その直後にドットが続きます。あるいは、あなたが意味することを理解できないかもしれません。非終端記号のFOLLOW集合は、その非終端記号のインスタンスの後に次の入力の次に来るトークンの集合です。 – rici