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

时间:2018-12-11 22:37:56

标签: c++ bison flex-lexer

我设法在Windows 10上安装了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文件中发生。长输出中的第一个错误之一报告:

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: '\0'
1>    ■%        ^
1>  parser.y:1.4-15.2: error: syntax error, unexpected {...}
1>    ■%        ^^^^^^

似乎win_flex拒绝我提供的任何输入中的每个字符。 所以问题是我明显地想念还是应该停止浪费时间并使用Jflex和Cup?

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

1 个答案:

答案 0 :(得分:1)

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

  • 文件开头的BOM,如果有的话(从野牛错误中可以肯定有)。

  • 不间断空格。