2009-07-15 8 views
5

저는 파서 생성기에 Flex와 Bison을 사용하고 있지만 스캐너의 시작 상태에는 문제가 있습니다.Lex/Flex의 시작 상태

나는 주석 처리하는 전용 규칙을 사용하고 있지만,이 문법은 인용 토큰과 일치하지 않는 것 :이 간단한 예에서 라인

%x COMMENT 

//     { BEGIN(COMMENT); } 
<COMMENT>[^\n]  ; 
<COMMENT>\n   { BEGIN(INITIAL); } 

"=="     { return EQUALEQUAL; } 

.      ; 

을 :

// a == b 

ISN을 ' 이 규칙을 포함시키지 않는 한 전적으로 댓글로 매칭됩니다.

<COMMENT>"=="    ; 

어떻게해야합니까? 이 모든 토큰을 독점 규칙에 추가해야합니까? 렉스/플렉스 또는 어떤에서

답변

9

매칭 C 스타일의 코멘트를 잘 설명되어 있습니다 : 인터넷의 주위에

in the documentation뿐만 아니라 다양한 변화를. 여기

는 플렉스 문서에서 발견의 변형이다 첨가

<INITIAL>{ 
    "//"    BEGIN(IN_COMMENT); 
    } 
    <IN_COMMENT>{ 
    \n  BEGIN(INITIAL); 
    [^\n]+ // eat comment 
    "/"  // eat the lone/
    } 
+0

많은 규칙이 있으므로 피할 수있는 경우 포괄적 인 상태를 사용하지 않아도됩니다. 문제는 '의견 입력'규칙이 두 개 이상의 문자 (예 : ==)가있는 토큰과 일치하지 않는 것입니다. – Dan

+0

그러면 뭔가 잘못하고있는 것 같아요. 주석을위한 '하위 파서'를 만들어야합니다.이 토큰은 일반 토큰과 일치하지 않습니다. –

+0

말하자면, 각 입력 행을 저장하고 싶다면 잘못된 행 번호를 줄 것입니까? –

2

시도는 "+"는 [^ N] 규칙 후. 독점적 인 주 (state)가 독점적 인 상태에서도 여전히 '=='을 선택하는 이유는 모르겠지만 분명히 그렇습니다. Flex는 일반적으로 대부분의 텍스트와 일치하는 규칙과 일치하며, "+"를 추가하면 적어도 두 규칙이 길이가 동일하게됩니다. COMMENT 규칙을 먼저 적용하면 동점 일 경우 COMMENT 규칙이 사용됩니다.

0

단서는 다음과 같습니다

문제는이 '의견을 먹는' 규칙이

그래서 제로에 일치하는 *를 추가 더 문자를 하나 이상으로 토큰을 일치하지 않는 것입니다 또는 non-newlines 이상인 경우. 0을 원할 경우 빈 주석이 일치하지 않습니다.

%x COMMENT 

//     { BEGIN(COMMENT); } 
<COMMENT>[^\n]*  ; 
<COMMENT>\n   { BEGIN(INITIAL); } 

"=="     { return EQUALEQUAL; } 

.      ; 
+0

빈 주석은 해당 규칙에 대한 일치를 트리거하지도 않으며 필요하지도 않습니다. – Darryl

+0

사실, 그 아래의 줄이 그걸 잡습니다. 따라서 *를 +로 변경하는 것이 안전합니다. –