5
필자의 렉서와 파서에 문제가 있습니다.플렉스/들소 : 잘못된 토큰 관리입니까?
첫째, 내 렉서에서 나는했습니다 같은 라인 :
stmt: IF '(' exp ')' stmts
...
stmts: stmt
| '{' stmt_list '}'
| '{' '}'
그런 코드에서 :
if(sth) {
dosth;
}
if(other) {
doothersth;
}
beginScope
"if" beginScope(stOTHER); return IF;
그리고 내 파서에서
들소가if
문장의 끝 부분을 알지 못하기 때문에 (나는 생각한다) Bison은 두 번 호출 될 것이다. 그것은
IF
토큰을 발견했을 때, 그는
Flex 파일에서 "beginScope()"를 호출 할 수 있습니까? 이렇게하면 "}"을 볼 때'endScope()'를 할 수 있습니다. 이 단일 문자 표현식에서 OPENBRACE 및 CLOSEBRACE와 같은 토큰을 Bison으로 리턴하십시오. – chrisaycock
아니요, beginScope가 매개 변수에 유형이 필요하고 볼 수있는 것처럼 항상 "{"가 없기 때문에 – gnidmoo
파서 작업으로'beginScope' 작업을 이동하십시오. 필요한 경우 [mid-rule action] (http://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Actions.html)을 사용하십시오. 렉서는 부작용이 없어야합니다. 정확히 당신이 발견 한 이유입니다. – zwol