2014-10-15 11 views
0

누군가가 c 프로그램이 goto와 블록 (레이블)을 구문 분석하기 위해 lex 및 yacc 파일을 코딩하는 방법을 이해할 수 있습니까?고토와 블록을 구문 분석하기위한 컴파일러 디자인 코드

<statement> ::= 
<variable> <inc> <semi> 
| <variable> <assign> <null> <semi> 
| <goto> <label> <semi> 

하지만 어떻게 고유하게 식별하는 라벨 : 여기

내가 그물에서 발견 된 일부 예입니다. 누군가가 나에게 이것이 언급 된 링크 또는 링크의 예를 들어 줄 수 있습니까?

답변

0

파서의 일부로 "고유하게 식별"할 필요가 없으며 레이블은 언어 구문으로 식별됩니다. 레이블이 다른 기호/변수 이름과 겹치도록 허용하는 것은 전적으로 합법적입니다. 합법적 인 레이블을위한 규칙을 추가하고, 렉서 TOKEN을 IDENTIFIER에 재사용 한 다음 함수 당 심볼 테이블에 레이블을 저장하여 중복 된 레이블을 탐지 할 수 있습니다.

일반적으로 C와 유사한 언어에서 레이블은 명령문 규칙의 일부입니다. 보통 다른 곳에서는 이해가되지 않습니다. 나는 그것을 할 방법 :

labeled_statement: 
    IDENTIFIER ':' statement 
    { 
     $$ = $3; 
     $$->label = new Label($1); 
    } 
    ; 

또 다른 방법 : 또 다른 정의에서

label: 
    IDENTIFIER ':' 
    { $$ = new Label($1); } 
    ; 

labeled_statement: 
    label statement 
    { 
     $$ = $2; 
     $$->label = $1; 
    } 
    ; 
1

<label> 여기에는 실제로 프로그램이 올바른 레이블 정의에 해당해야하는 기호 (식별자)가 포함됩니다.

+0

,