C LEX-yylineno返回1

C LEX-yylineno返回1,c,lex,C,Lex,我在网上尝试了很多解决方案。我尝试过的解决方案之一是通过以下链接: 但它们似乎都不适用于我生成符号表的代码。 yylineno值不会更改。它继续显示1 我在输入文件中提供的输入是: 这是我的代码片段: 另外,我说的是莱克斯,不是亚克。虽然相似,但我已经尝试过了 但是这个解决方案对我不起作用 其他问题表明Flex能够通过%选项yylineno指令自动管理yylineno。然而,与经典的Lex相比,这是Flex中的一个扩展 假设您无法升级到Flex, 您可能需要替换您的规则 \n { } 与 另

我在网上尝试了很多解决方案。我尝试过的解决方案之一是通过以下链接:

但它们似乎都不适用于我生成符号表的代码。
yylineno
值不会更改。它继续显示1

我在输入文件中提供的输入是:

这是我的代码片段:

另外,我说的是莱克斯,不是亚克。虽然相似,但我已经尝试过了
但是这个解决方案对我不起作用

其他问题表明Flex能够通过
%选项yylineno
指令自动管理
yylineno
。然而,与经典的Lex相比,这是Flex中的一个扩展

假设您无法升级到Flex, 您可能需要替换您的规则

\n { }



另一方面,在格式字符串末尾使用换行符打印效果最好。当换行符被“打印”时,缓冲输出通常会被刷新,因此在打印换行符之后的换行符之前,输出不一定会出现。计划在格式字符串的末尾写换行符,除非有不完整的行。只有当您需要将输出增加一倍空格时(或者您担心其他人不愿意用换行符结束输出),才需要在开始处换行。

在您认为合适时,您有责任推进行计数器@KerrekSB没有定义任何自动函数来扫描行号并将其返回给我们吗?您可能需要将
\n{}
替换为
\n{yylineno++;}
。此外,打印效果最好的是在结尾处有换行符(换行符“打印”时缓冲输出通常会被刷新,因此在您打印换行符之后的输出之前,输出不一定会出现)。@Kay我说的是lex。虽然类似,但解决方案并不适用me@JonathanLeffler谢谢你的建议!它起作用了。
%%

{pound}{includekey}{openarrow}{alpha}+{closearrow}              
{printf("\n %s : Preprocessor Directive at line no: %d!", yytext, yylineno); newfunction(yytext,"Preprocessor",yyleng);}

{mainkey}{openpara}{closepara}                          {printf("\n %s : Main function found at line no: %d! ", yytext, yylineno); newfunction(yytext,"main",yyleng);}

{alpha}[{underkey}|{alpha}|{digit}]+{openpara}{closepara}           {printf("\n %s : Userdefined function without parameters found at line no: %d!", yytext, yylineno);newfunction(yytext, "function",yyleng);}

{conditional}                                   {printf("\n %s : If statement encountered at line no: %d!", yytext, yylineno);newfunction(yytext,"if", yyleng);}

{control}                                   {printf("\n %s : Control statement encountered at line no: %d!", yytext, yylineno);newfunction(yytext,"control", yyleng);}

{datatypes}                                 {printf("\n %s : Datatype found at line no: %d!", yytext, yylineno);newfunction(yytext, "datatype", yyleng);}

{alpha}*                                    {printf("\n %s : Variable found at line no: %d!", yytext, yylineno);newfunction(yytext, "variable", yyleng);}

{operators}                                 {printf("\n Operator %s found at line no: %d!", yytext, yylineno );}

\n                                      { }

.                                       {printf("\n Unexpected character!");}


%%
\n { }
\n { yylineno++; }