2017-02-10 2 views
2

잠깐 동안 나는 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이 ε 케이스를 잃어 버린 것처럼 느껴지거나, 잘못된 방법으로 처리되었을 수도 있지만, 어떻게 처리해야할지 모르겠습니다. 아무도 도와 줄 수 없습니까?

+0

사용중인 언어에 대한 태그를 추가하십시오. – Downvoter

+0

@Downvoter : 이것은 특정 언어에 관한 것이 아닙니다. 그는 꼬리표가 필요 없다. –

+0

글쎄, 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 –

답변

2

하향식 예측 구문 분석기의 동작은 질문에서 언급 한 것과 동일합니다. 즉, 두 번째 문법은 하향식 구문 분석에 적합하지 않습니다 (하나의 토큰 미리보기를 사용). 많은 문법은 그렇지 않습니다. 유한 문안을 기반으로 사용할 프로덕션을 예측할 수없는 문법을 포함합니다.

두 개의 토큰 대신 하나의 토큰을 살펴보면 충돌을 해결할 수 있습니다. 제 토큰 이고 M 모든 다른 두 토큰 lookaheads에 룩어 END의 ε 생산 및 aM 생산을 예측한다.