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的错误来看,肯定有)
不间断空格。
我设法在 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的错误来看,肯定有)
不间断空格。