2010-07-04 3 views
0

나는 지금 프로그래밍 수업의 교장을 맡고있다.LL (1) 좋은, 깨끗한 자료를 찾고있는 문법

우리는 LL (1) 문법에 대해 배우고 있습니다.

나는이 책과 강의가 다소 불명확하며 누군가 나를 좋은 자원으로 안내 할 수 있기를 희망했다.

필자는 finate state automatons와 determinate state automatons에 대한 좋은 유튜브 튜토리얼을 발견했지만, LL (1) 문법과 비슷한 것은 찾을 수 없다. 공정한 정보가있는 것 같아 혼란 스럽습니다. "쉬운 단계"접근 방식을 찾고 있습니다.

좋은 주말 보내십시오! 7 월 4 일에 미국인 여러분!


편집 : 나는 어떻게 먼저 작품을 이해하지만 후속에 명확하지 않다.

답변

2

기본적으로 LL은 "하향식"을 의미합니다.

위에서 아래 구문 분석기는 문법의 최상위 요소를 먼저 구문 분석하고 해당 요소를 시작하는 데 필요한 토큰을 소비 한 다음 더 자세한 요소로 '아래쪽'으로 재귀하는 방식으로 진행됩니다. 문법.

하향식 구문 분석을 이해하는 가장 쉬운 방법은 파서를 구현하는 것입니다.

void parseFile() 
{ 
    while(classesContinue()) 
    { 
     parseClass(); 
    } 
} 

void parseClass() 
{ 
    consume(Tokens.Class); 
    consume(Tokens.ID); 
    consume(Tokens.LCurly); 
    while(membersContinue()) 
    { 
     parseMember(); 
    } 
    consume(Tokens.RCurly); 
} 

다음 LL에 paranthesis의 숫자 (LL에서와 같이 (1))에 의해 만들어 질 필요가있는 "선택"을 구현하기에 앞서 필요한 볼의 최대 수는 다음과 같은 가상의 예를 보일 수 있습니다 파서. 예를 들어, "parseMember은"보일 수 있습니다처럼 :

void parseMember() 
{ 
    parseTypeName(); 
    parseID(); 
    switch (lookAhead()) 
    { 
     case Tokens.Semi: 
     case Token.Equals: 
      parseVariableDecl(); 
      break; 
     default: 
      parseMethod(); 
      break; 
    } 
} 

하는 경우 파서는 LL 것 (1),이 내다 중 하나 토큰을 필요로하기 때문이다.

어쨌든 LL (1) 문법은 공식 표기법 (일반적으로 EBNF의 일부 변형)에서 LL (1) 파서의 사양 일뿐입니다.

도움이 되었습니까?

0

기본적으로, 비단 말 A의 후속 세트는 주석에 표시된 것입니다. 그것은 바로 다음에 이어질 수있는 비 터미널 집합입니다.

LL grammars and parsers에 관한 위키 백과 문서, 특히 충돌에 관한 부분을 읽어보십시오.