我正在使用 flex 2.5.35 和 bison 2.7(尽管我相信这是一个 flex 问题,所以我省略了 parser.y)
我的 Flex 语法很简单:
词法分析器
%{
#define YY_NO_INPUT
#include "parser.h"
#define YY_USER_ACTION yylloc->first_line = yylloc->last_line = yylineno; \
yylloc->first_column = yycolumn; yylloc->last_column = yycolumn + (int)yyleng - 1; \
yycolumn += (int)yyleng;
%}
%option yylineno
%option outfile="lexer.c" header-file="lexer.h"
%option warn
%option reentrant noyywrap never-interactive nounistd
%option nounput
%option bison-bridge
%option bison-locations
%%
[ \n\r\t]* { /* Skip blanks. */ }
[A-Za-z0-9_\-@]+ { yylval->value = strdup(yytext); return TOKEN_VAR; }
"&&" { return TOKEN_AND; }
"||" { return TOKEN_OR; }
"!" { return TOKEN_NOT; }
"(" { return TOKEN_LPAREN; }
")" { return TOKEN_RPAREN; }
%%
扫描字符串时,行号和列号的值是未初始化的垃圾。我跟踪代码并将以下行添加到生成的 lexer.c 中的 yy_scan_buffer 中:
b->yy_bs_lineno = 1;
b->yy_bs_column = 1;
现在这些值符合预期。
这是一个错误吗?yy_create_buffer
正确初始化这些字段,但yy_scan_buffer
没有。
%option yylineno
解析字符串时不能使用吗?
有解决办法,还是我真的需要修改生成的 lexer.c?