对于编译器中的一个项目,我在语法分析器中遇到一个问题,
当我在符号表中添加符号时,我在 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;
%}
当我在符号表中添加一些东西时,在语法中:
i.e
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
from flex
,那么你应该添加一行
%option yylineno
to your flex
规格。但请注意,不建议导出yylineno
直接到您的语法,因为您的语法可能会请求来自分词器的前向标记,因此yylineno
可能已经更新了。据称的处理方式yylineno
是通过yylval
。我也看到过bison
具有新的行编号功能(请参阅@1
and @@
等)可能会更轻松地与flex
.
P.S: 看我说的是bison
,你只提到yacc
。如果您致力于yacc
,通过它yylval
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)