2013-03-15 3 views
2

yyerror 함수에서 줄 번호를 인쇄하려고하면 오류가 발생합니다. 나는 OSX에서 일하고있다.Flex Bison : Building C 컴파일러 - 줄 번호 오류 메시지

(compiler.l에서 행 번호)

%{ 

#include "compiler.tab.h" 
int lineNumber = 1; 

%} 
%% 

int { return INT; } 
float { return FLOAT; } 
void { return VOID; } 
do { return DO; } 
while { return WHILE; } 
if { return IF; } 
return { return RETURN; } 
else { return ELSE; } 
\/\/(.)* { return COMMENT; } 
\/\*(.)*\*\/ { return COMMENT; } 
[a-zA-Z][a-zA-Z0-9_]* { return IDENT; } 
[0-9]+\.[0-9]+ { sscanf(yytext, "%lf", &yylval.reell); return FVAL; } 
[0-9]+ { yylval.integer = atoi(yytext); return IVAL; } 
\({ return OPA; } 
\) { return CPA; } 
\{ { return OB; } 
\} { return CP; } 
\; { return SEMICOLON; } 
\, { return COMMA; } 
\! { return NOT; } 
\-\- { return DECREMENT; } 
\+\+ { return INCREMENT; } 
\<\< { return LSHIFT; } 
\=\= { return EQUALS; } 
\<\= { return LTOE; } 
\>\= { return GTOE; } 
\&\& { return AND; } 
\|\| { return OR; } 
\= { return ASSIGNMENT; } 
\< { return LT; } 
\> { return GT; } 
\/ { return DIVIDE; } 
\* { return MULTIPLY; } 
\+ { return PLUS; } 
\- { return MINUS; } 
[ ]+ { return BLNK; } 
[\n]* { ++lineNumber; return NL; } 

%% 

compiler.c

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include "compiler.h" 

extern int lineNumber; 

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

void yyerror(char * str) 
{ 
    fprintf(stderr, "Error: %s, Line %d\n", str, lineNumber); 
} 

나는 다음과 같은 오류 메시지가 얻을 : 아키텍처 x86_64에 대한

정의되지 않은 문자 : "_lineNumber ", 참조 된 에서 : _yyerror in compiler.o ld : ar (을)를 찾을 수 없습니다. chitecture의 x86_64에의 collect2 : LD가 반환 한 종료 이것은 내가 컴파일하는 데 사용하는 명령 (쉘 파일)입니다

상태 :

#!/bin/bash 

flex compiler.l 
bison -d compiler.y 

gcc -g -c compiler.tab.c -o compiler_y.o 
gcc -g -Wall -std=c99 -c lex.yy.c 
gcc -g -c compiler.tab.c -o compiler_y.o 

gcc -g -Wall -std=c99 -c compiler.c 
gcc -g -o compiler compiler.o compiler_y.o lex.yy.o -lm -lfl 
+0

태그를 지정할 때주의하십시오. Flex는 Apache/Adobe UI 프레임 워크에 사용됩니다. Gnu-flex는 어휘 분석기에 사용됩니다. – JeffryHouser

+0

'.l' 파일에서 그 행을 어디에 넣었습니까? 외부 심볼로 정의하지 않은 것 같습니다. (그렇다면 실행 파일에 컴파일 된 렉서를 포함하지 않습니다.) – rici

+0

@rici 나는 compiler.l의 전체 코드를 넣었다. 희망이 도움이됩니다. 도와 주셔서 감사합니다. – hapablap

답변

6
당신은 당신의 플렉스 소스에 %option yylineno를 사용하고 변수 int yylineno이 줄 것이다

현재 토큰의 행 번호. 문법 (bison/yacc)에서 yylineno을 사용하지 않도록주의하십시오. 토크 나이저는 일반적으로 파서보다 앞서 있기 때문입니다. 파서에서 줄 번호를 사용하려면 일반적으로 줄 번호가 토큰에 연결되므로 파서는 토큰을 통해 액세스 할 수 있습니다.

오류 메시지

가능성 그것에 flex 실행하고 C 컴파일러 통과시켜 compiler.l에서 얻어진 compiler.tab.o에 연결하지 않음으로써 발생한다.