野牛& rec2c:获取当前行号

时间:2012-02-28 19:18:43

标签: c++ bison yacc

我正在处理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完成的。

1 个答案:

答案 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(); }