这个问题已经有了答案:
Flex yylineno set to 1
1个答案
对于编译器中的一个项目,语法分析器中有一个问题,
当我要在符号表中添加一个符号时,我在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;
}
}
线没有变化,总是有1作为值…
有什么想法吗?
最佳答案
假设您使用的是yylineno
fromflex
,那么您可能应该添加一行
%option yylineno
符合您的
flex
规范。但是请注意,不建议直接将yylineno
导出到语法中,因为语法可能会从标记赋予器请求先行标记,因此yylineno
可能已经更新。处理yylineno
的专业方法是通过yylval
。我还看到bison
有新的行号功能(参见@1
和@@
等),可能更容易与flex
集成。注意:我说的是
bison
,你只提到了yacc
。如果您致力于yacc
,请通过yylval
。