我正在处理PHP语法,我想将行号传递给我的函数 我有类似的东西: internal_functions_in_yacc:
T_ISSET '(' isset_variables ')'
| T_EMPTY '(' variable ')'
| T_INCLUDE expr { observers.IncludeFound($2); }
| T_INCLUDE_ONCE expr { observers.IncludeFound($2); }
| T_EVAL '(' expr ')'
| T_REQUIRE expr { observers.IncludeFound($2); }
| T_REQUIRE_ONCE expr { observers.IncludeFound($2); }
;
现在我想传递行号,比如
T_REQUIRE_ONCE expr { observers.IncludeFound($2,$line_number_here); }
有没有办法知道bison正在解析的令牌的行号?或者它是否需要在lexing中完成?
修改
我发现lexing是使用rec2c而不是lex完成的。
答案 0 :(得分:5)
如果line numbers are enabled,则可以使用@n
访问它们,其中n是令牌位置。
T_REQUIRE_ONCE expr { observers.IncludeFound($2,@2.first_line); }
修改强>
扩展答案%locations
是链接中的指令,用于启用野牛中的行号。词法分析器仍然负责增加行号并需要%option yylineno
。
Lex文件:
\n { yylloc->lines(yyleng); yylloc->step(); }