2017-03-13 12 views
0

내 작업 FIRST를 계산하고 다음과 같은 문법 세트를 따르는 것입니다 설정 :

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

내가받은 다음 첫 번째 세트 : 내가 계산 한 다음 세트

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} 

저는 제 솔루션을 먼저 사용해 보았고 세트 제너레이터를 사용했고 다음과 같이했습니다 : FOLLOW(S) = {'.', left, right, low}. 발전기의 해결책이 정확하고 왜입니까? 수식을 사용하여 솔루션을 계산했습니다 : FOLLOW(S) = FIRST({left,right,low} concat FOLLOW(P)) = {left, right, low}. 누군가 내/제너레이터의 해결책이 올바르지 않은 이유를 설명해 주시고 제가 다른 모든 것이 제대로되어 있는지 확인해 주실 수 있습니까? 나는 또한 내가 왜 int을 처음으로 가지고 있지 않은지 알고 싶습니다. 나중에 설정을하면 나중에 파서를 만들 때 괜찮습니다. 고맙습니다.

답변

1

FOLLOW 세트를 계산할 때는 빈 제작에주의해야합니다. 이 경우

, CS P → S CS .S가있는 . 하였다 될 수 있다는 것을 의미 빈 생산을 갖는다. 마찬가지로, C CSC는 생산의 마지막에 될 수 있으므로 C는 단지 left 또는 right 토큰 후 나타날 수있는 .

int 다음에 할 수있다. 그것은 nom-terminal의 처음에는 나타나지 않을 수도 있고 non-terminal의 바로 뒤에 나타날 수도 없습니다. 따라서 FIRST 또는 FOLLOW 세트에 포함되지 않을 것으로 예상됩니다.

+0

고마워요. :) 저는 처음부터 어떻게 설정되어 있는지 지금 완전히 이해하고 있다고 생각합니다. 나는 한 가지만 더 질문한다. 이러한 규칙에 따라 FOLLOW 세트를 결정하는 방법에는 ''이 포함될 규칙을 볼 수 없습니다. 내 FOLLOW (S) 세트에 ... 이처럼 빈 프로덕션에주의를 기울여야합니까? 아니면 실제로 이것을 결정하는 규칙이 있습니까? – Luki

+1

제 답변의 두 번째 단락 인'P → S CS '에서 지정한 규칙입니다. CS가 비어 있으면 점 바로 뒤에 S가옵니다. 아니면 내가 무슨 뜻인지 이해하지 못할 수도 있습니다. FOLLOW 집합의 비단 말은 그 비단 말의 인스턴스 다음에 다음에 입력 할 수있는 토큰 집합입니다. – rici