2012-09-22 2 views
1

오류가 발생한 행 번호를 인쇄하는 방법은 무엇입니까? 두 번째는초급 bison flex

error: redefinition of yylineno 
lex.yy.c:273: note: previous definition of yylineno was here 
+1

조금 더 자세하게 입력하면 도움이 될 것입니다. yyerror는 bison skeleton에 의해 호출됩니다. yylineno는 flex에 의해 제공됩니다 (보통 매크로입니다). yyerror가 포함되어있는 컴파일 단위에서 볼 수있는 yylineno 정의를 준비하지 않았을 것입니다 (C++을 사용하는 경우 특히 쉽지만 일반 C 배열을 사용하면 쉽습니다). 다른 플렉스 옵션은 무엇입니까? 사용 하시겠습니까? (예를 들어, 재 입력을 요청 했습니까?) – rici

답변

2

있다 : 나는 yyerror() 기능에 yylineno을 사용하고 .l 파일에 %option yylineno를 작성하지만, 컴파일 후 나에게 오류 "yylineno undeclared (first use in this function)"를 제공하고 내가 1로 yylineno를 초기화 할 경우 나에게 오류를 제공 노력 flex가 전역 변수 yylineno를 제공하도록 요청하는 방법 : 명령 행 스위치 -l. 그것이 당신을 위해 작동하지 않는다면, Levine et al. 제안. 개행과 일치하는 모든 규칙에서 그것을 증가시킵니다.

%{ 
    int mylineno = 1; 
%} 
%% 
* * * 
\n { mylineno++; } 
1

문제가 될 수있는 방법에는 여러 가지가 있지만 관련이있는 것은 추측하기 어렵습니다.

  1. 당신은 플렉스 소스 (.l 파일과 소스에서 생성 된 오브젝트 파일)에 정의 된 변수가 있지만 들소 문법 (.y 파일) 또는 헤더에 선언하지 않는, 그래서 문법을 컴파일 할 때 선언되지 않습니다.

  2. 문법에서 선언 했는데도 문제가 계속 발생합니다. 문법이나 어휘 분석기에서 생성 된 .c 파일의 조각 순서는 예상 한 것이 아니므로 선언되기 전에 변수를 참조하게됩니다. 코드를 참조하는 코드는 %{ ... %} 블록에 나타날 수도 있고 두 번째 %% 섹션 마커 다음에 나타날 수도 있고 문법 (또는 어휘 분석기) 액션 블록 중 하나에 나타날 수도 있고 소스의 다른 위치에 나타날 수도 있습니다. yylineno 변수를 참조하는 이들 각각이 블록에서 순수한 선언 (헤더를 통해 가능)을하면 코드가 정상이어야합니다. 중복을 제거하려고 시도하지만 자신을 반복 할 위험이 있으므로 (헤더가 멱등 류일 경우 큰 문제가 아니어야 함) 모든 적절한 섹션에서 해당 헤더가 선언되었는지 확인할 수 있습니다.

기본적으로 어휘 분석기의 정보는 문법에 포함되어 있지 않습니다. 공유 정보가 적절히 선언되고 정의되도록해야합니다.

+0

.y 파일에서 yyerror를 초기화 한 경우 .y 파일에서 어떻게 공유합니까? – user1690394