2010-05-10 3 views
1

Hallo,Flex/Bison 파트 2를 사용한 구문 분석

Lex/Yacc 프로그래밍에 도움이 필요합니다. 나는 많은 문장의 입력에 대한 구문 분석을위한 컴파일러를 썼다. 이제 나는 특별한 문제가있다.

입력의 경우, 컴파일러는 올바른 출력을 제공합니다. 어떤 명령문은 사용법, 상수 연산자 또는 jmp 강사를 사용하여 레이블을 작성합니다. 이제 if 문이 오면 이제 첫 번째 명령 (그 전에는 else)는 if의 할당이 yes 일 때 포기해야만한다. 그 다음엔 else 명령이 필요 없기 때문에 끝으로 건너 뛰어야한다. 그래서이 jmp 다음에 두 번째 명령을 내줘야한다. 예를 들어 내가 무엇을 의미하는지 이해할 수 있는지를 보여줍니다.

입력 주소. 출력

if(x==0)  10 if(x==0) 
Wait 5   20 WAIT 5 
else   30 JMP 50 
Wait 1   40 WAIT 1 
end    50 END 

이렇게하십시오. 나는 if 문은 컴파일러가 문 적힌 끝을 인식하는 입력에있다 주어진 내 컴파일러 내 jmp_stmt을 좋아하면 아마 내가 (

IF exp jmp_stmt_end stmt_seq END 

같은 특별한 if 문 아 파크 그것을 할 수 있습니다, 아이디어가 당신 파일을 http://bitbucket.org/matrix/changed-tiny에서 다운로드해야합니다. 끝까지 이동하십시오. 내 문제를 이해하길 바래. 감사합니다.

답변

3

나는 2 단계 출력으로이 작업을 수행합니다. 첫 번째 패스는 각 출력 문과 점프 대상이 레이블로 인코딩 된 목록을 생성하고 두 번째 패스는이 목록을 사용하여 실제를 생성합니다 산출. 이런 식으로 뭔가 :

패스 하나

Number Label Satatement 
10   if(x==0) 
20   WAIT 5 
30   JMP (A) 
40   WAIT 1 
50  A END 
+0

1. 이 과정을 "백 패치 (backpatching)"라고하며 ** 단일 패스로 수행 할 수 있지만 여기에서 제공되는 2- 패스 접근 방식은 구현하기가 훨씬 쉽고 간단합니다. –

관련 문제