我设法在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。我不知道应该怎么办,会不会引起问题。
答案 0 :(得分:1)
Flex和bison输入文件应为ASCII,而不是UTF-8。确保文件中没有基本ASCII字符集以外的字符。这包括:
文件开头的BOM,如果有的话(从野牛错误中可以肯定有)。
不间断空格。