문제

Test.l을 만들었습니다.

기본 함수가 다음과 같이 구현 될 때

int
main(void)
{
    yylex();
    return 0;
}

나는 문제 없다.

나는 첫 번째 캐릭터가 항상 세미콜론이라고 믿도록 파서를 속이고 싶습니다.

int
main(void)
{
    unput(';');
    yylex();
    return 0;
}

위의는 세그먼트 오류로 이어집니다.

미지의 사용이 세그먼트 결함으로 이어지는 이유는 무엇입니까?

도움이 되었습니까?

해결책

yylex ()가 아직 입력 버퍼 등을 초기화하지 않았기 때문에 세그먼트 결함을 일으킨다.

스캐너를 선행 세미콜론으로 속일 필요없이 스캐너를 설계하는 더 좋은 방법이있을 수 있지만,이 작업을 수행 해야하는 경우 하나의 솔루션은 시작 조건을 사용하는 것일 수 있습니다. 이 같은:

%x SPECIAL
%%
    BEGIN(SPECIAL); /* Go to SPECIAL state when yylex first called */

<SPECIAL>.  { unput(*yytext); unput(';'); BEGIN(INITIAL); }

... rest of rules ...

다른 팁

아래 코드는 의미에서 잘못되지 않습니다.

int main(void) { unput(';'); yylex(); return 0; }

문제는 Flex에서 나왔습니다 unput 매크로와 물론 당신은 전에 LEX를 초기화해야합니다.

그러나 당신이 당신의 메인을 외부에두면 .l file, 귀하의 코드는 segfault가 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top