Lex / Flex에서 상태를 시작하십시오
-
16-09-2019 - |
문제
파서 생성기에는 Flex와 Bison을 사용하고 있지만 스캐너의 시작 상태에 문제가 있습니다.
의견을 다루기 위해 독점 규칙을 사용하고 있지만이 문법은 인용 된 토큰과 일치하지 않는 것 같습니다.
%x COMMENT
// { BEGIN(COMMENT); }
<COMMENT>[^\n] ;
<COMMENT>\n { BEGIN(INITIAL); }
"==" { return EQUALEQUAL; }
. ;
이 간단한 예에서 선은 다음과 같습니다.
// a == b
이 규칙을 포함하지 않는 한 전적으로 의견과 일치하지 않습니다.
<COMMENT>"==" ;
이 모든 토큰을 독점적 인 규칙에 추가하지 않고도 어떻게 되나요?
해결책
Lex/Flex 또는 잘 문서화 된 C 스타일의 의견에 맞는 :
문서에서, 인터넷 주변의 다양한 변형뿐만 아니라.
Flex 문서에서 찾은 것의 변형은 다음과 같습니다.
<INITIAL>{
"//" BEGIN(IN_COMMENT);
}
<IN_COMMENT>{
\n BEGIN(INITIAL);
[^\n]+ // eat comment
"/" // eat the lone /
}
다른 팁
^n] 규칙 이후 "+"를 추가하십시오. 나는 독점 상태가 여전히 독점 상태에서도 '=='를 집어 올리는 이유를 모르겠지만 분명히 그렇습니다. Flex는 일반적으로 가장 많은 텍스트와 일치하는 규칙과 일치하며 "+"를 추가하면 최소한 두 규칙을 길이로 연결합니다. 주석 규칙을 먼저두면 타이의 경우 사용됩니다.
단서는 다음과 같습니다.
문제는이 'Eat Eat Comment'규칙이 하나 이상의 캐릭터와 토큰과 일치하지 않는 것 같습니다.
따라서 a *를 추가하여 0 개 이상의 비 뉴 라인을 일치 시키십시오. 그렇지 않으면 빈 주석이 일치하지 않습니다.
%x COMMENT
// { BEGIN(COMMENT); }
<COMMENT>[^\n]* ;
<COMMENT>\n { BEGIN(INITIAL); }
"==" { return EQUALEQUAL; }
. ;
제휴하지 않습니다 StackOverflow