Win flex-bison 编译产生无效字符错误

Win flex-bison compiling produces invalid character errors

我设法在 Windows10 上安装了 win flex-bison(版本 2.5.16)。我从我找到的其中一个教程中复制了一个示例词法分析器程序,并尝试使用以下指令对其进行编译:

win_flex -o lexer.cpp lexer.l

文件 lexer.l 是:

%option noyywrap

%{
#include <stdio.h>

#define YY_DECL int yylex()

#include "calc.tab.h"

%}

%%

[ \t]   ; // ignore all whitespace
[0-9]+\.[0-9]+  {yylval.fval = atof(yytext); return T_FLOAT;}
[0-9]+      {yylval.ival = atoi(yytext); return T_INT;}
\n      {return T_NEWLINE;}
"+"     {return T_PLUS;}
"-"     {return T_MINUS;}
"*"     {return T_MULTIPLY;}
"/"     {return T_DIVIDE;}
"("     {return T_LEFT;}
")"     {return T_RIGHT;}
"exit"      {return T_QUIT;}
"quit"      {return T_QUIT;}

%%

当我编译它时,它会在文件的每一行报告一堆类似的错误,例如:

lexer.l:19: bad character:
lexer.l:19: bad character: }
lexer.l:19: bad character:
lexer.l:19: bad character:
lexer.l:19: bad character:
lexer.l:20: bad character:
lexer.l:20: bad character: "
lexer.l:20: bad character:
lexer.l:20: bad character: *
lexer.l:20: bad character:
lexer.l:20: bad character: "
lexer.l:20: bad character:
lexer.l:20: bad character:
lexer.l:20: bad character:
lexer.l:20: bad character: {
lexer.l:20: bad character:
lexer.l:20: unknown error processing section 1
lexer.l:20: bad character:
lexer.l:20: unknown error processing section 1
lexer.l:20: bad character:
lexer.l:20: unknown error processing section 1
lexer.l:20: bad character:
lexer.l:20: unknown error processing section 1
lexer.l:20: bad character:
lexer.l:20: unknown error processing section 1
lexer.l:20: bad character:
lexer.l:20: unknown error processing section 1
lexer.l:20: bad character:
lexer.l:20: bad character:

我要补充的是,这发生在 win_flex 的旧版本以及我尝试过的所有其他示例词法分析器文件中。长输出中的第一个错误报告如下:

lexer.l:1: bad character:  
lexer.l:1: bad character: ■
lexer.l:1: bad character: %

我不知道这些字符是从哪里来的。当我编译 parser.y 文件时,win_bison 也发生了类似的事情,但只有几条错误消息(与上面的非常相似):

Process "parser.y" bison file
1>  parser.y:1.1-2: error: invalid characters: ' ■'
1>    ■%     ^^
1>  parser.y:1.3: error: invalid character: '%'
1>    ■%       ^
1>  parser.y:1.4: error: invalid character: '[=14=]'
1>    ■%        ^
1>  parser.y:1.4-15.2: error: syntax error, unexpected {...}
1>    ■%        ^^^^^^

似乎 win_flex 拒绝了我提供的任何输入中的每个字符。 所以问题是我是否遗漏了一些明显的东西,或者我应该停止浪费时间并使用 Jflex 和 Cup?

编辑:某处有人提到这可能是文件编码的问题。我检查了它的 UTF-8。我不知道它应该是什么,它会不会引起问题。

Flex 和 bison 输入文件应该是 ASCII,而不是 UTF-8。确保文件中没有不在基本 ASCII 集中的字符。这包括:

  • 文件开头的BOM,如果有的话(从bison的错误来看,肯定有)

  • 不间断空格。