잠깐 동안 나는 LL 파서가 어떻게 작동 하는지를 배우려고 노력했으며, 이것을 올바르게 이해한다면 하향식 재귀 파서를 손으로 작성할 때 모든 비선형 파서에 대해 함수를 작성해야한다. 터미널 기호. 그래서 예를 들면 :문법 및 하향 파싱
Token B()
{
if (Lookahead(1) == 'b')
{
Eat('b');
Eat('g');
}
else if (Lookahead(1) == 'd')
{
Eat('d');
D();
Eat('e');
}
else
{
Error();
}
return B_TOKEN;
}
을하지만 난과 같은 일을하려고 : 각 S에 대한
S -> AB
A -> aA|ε
B -> bg|dDe
D -> ab|cd
나는 다음과 같이 함수를 작성하기 위해 A, B와 D이있을 것이다 나는 언어와 동일한 언어를 생성하기 위해 만들어 그 문법을 다음 (| B |는 C를) * 정규 표현식 : 날 수 있습니다
S -> Ma
M -> aM|bM|cM|ε
다음과 같은 기능 :
Token S()
{
char Ch = Lookahead(1);
if (Ch == 'a' || Ch == 'b' || Ch == 'c')
{
M();
Eat('a');
}
else
{
Error();
}
return S_TOKEN;
}
Token M()
{
char Ch = Lookahead(1);
if (Ch == 'a' || Ch == 'b' || Ch == 'c')
{
Eat(ch);
M();
}
return M_TOKEN;
}
'bbcaa'입력의 경우 M은 모든 것을 소비하므로 문법이 그것을 허용하더라도 S가 마지막 'a'를 찾지 못하고 오류를보고하지 않기 때문에 좋지 않은 것처럼 보입니다. M이 ε 케이스를 잃어 버린 것처럼 느껴지거나, 잘못된 방법으로 처리되었을 수도 있지만, 어떻게 처리해야할지 모르겠습니다. 아무도 도와 줄 수 없습니까?
사용중인 언어에 대한 태그를 추가하십시오. – Downvoter
@Downvoter : 이것은 특정 언어에 관한 것이 아닙니다. 그는 꼬리표가 필요 없다. –
글쎄, S 함수가 M을 호출하여 수락 여부를 확인한 다음 a를 확인해야하지만 그건 쓴 것이 아닙니다. 재귀 하강 파서를 작성하는 방법에 대한 내 대답을 참조하십시오. http://stackoverflow.com/questions/2245962/is-there-an-alternative-for-flex-bison-that-is-usable-on-8-bit -embedded-systems/2336769 # 2336769 –