私はflex2.5.35とbison2.7を使用しています(これはflexの問題ですが、私は信じているので、parser.yを省略しました)
私のFlex文法は非常に単純です:
lexer.l
%{
#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を本当に変更する必要がありますか?