2012-05-14 5 views
5

필자의 렉서와 파서에 문제가 있습니다.플렉스/들소 : 잘못된 토큰 관리입니까?

첫째, 내 렉서에서 나는했습니다 같은 라인 :

stmt: IF '(' exp ')' stmts 
... 
stmts: stmt 
     | '{' stmt_list '}' 
     | '{' '}' 

그런 코드에서 :

if(sth) { 
    dosth; 
} 

if(other) { 
    doothersth; 
} 

beginScope

"if" beginScope(stOTHER); return IF; 

그리고 내 파서에서

들소가 if 문장의 끝 부분을 알지 못하기 때문에 (나는 생각한다) Bison은 두 번 호출 될 것이다. 그것은 IF 토큰을 발견했을 때, 그는

+0

Flex 파일에서 "beginScope()"를 호출 할 수 있습니까? 이렇게하면 "}"을 볼 때'endScope()'를 할 수 있습니다. 이 단일 문자 표현식에서 OPENBRACE 및 CLOSEBRACE와 같은 토큰을 Bison으로 리턴하십시오. – chrisaycock

+0

아니요, beginScope가 매개 변수에 유형이 필요하고 볼 수있는 것처럼 항상 "{"가 없기 때문에 – gnidmoo

+3

파서 작업으로'beginScope' 작업을 이동하십시오. 필요한 경우 [mid-rule action] (http://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Actions.html)을 사용하십시오. 렉서는 부작용이 없어야합니다. 정확히 당신이 발견 한 이유입니다. – zwol

답변

1

잭이 언급 한 바와 같이 ...

이 제발 도와주세요 ... 그 if 문장의 끝으로 소요되며, 다른 if 문을 시작하는 그에게 두 번째 읽기 주석에서 파서 액션으로을 호출해야합니다 :

stmt: IF { beginScope(stOTHER); } '(' exp ')' stmts 
관련 문제