对于编译器中的一个项目我在语法分析器中遇到一个问题, 当我在符号表中添加符号时,我在yylineno中总是采用相同的值......
我在开头做了这个:
%{
int yylex(void);
int yyerror(char* yaccProvidedMessage);
extern int yylineno; //i declare yylineno from the lexical analyzer
extern char *yytext;
extern FILE *yyin;
int scope=0;
int max_scope;
%}
在语法中,当我在符号表中添加内容时:
即
lvalue: ID {
printf("<-ID");
add_data_to_symbol_table((char*)($1),scope,yylineno);
printf("lineNO:%d",yylineno);
}
;
输入时输出中的使用不同的行,它不识别新行
if(x<=2)
{
if(t<1)
{
k=2;
}
}
lineNO永远不会改变,总是有1作为值......
任何想法?
答案 0 :(得分:6)
假设您使用yylineno
中的flex
,那么您应该添加一行
%option yylineno
到您的flex
规范。但请注意,不建议将yylineno
直接导出到您的语法中,因为您的语法可能会请求从标记器中查看令牌,因此yylineno
可能已经更新。自称处理yylineno
的方式是yylval
。我还看到bison
有新的行编号功能(请参阅@1
和@@
等),这些功能可能更轻松地与flex
集成。
P.S:看我说bison
,你只提到yacc
。如果您致力于yacc
,请将其传递给yylval
。