我试图完成编写词法分析器的任务,但每次尝试使用flex创建lex.cc.y文件时我都会收到此错误:
" fofo.l",第13行:13警告规则无法匹配 " fofo.l",line:14警告规则无法匹配。
%{
#include <stdio.h>
#define Relop 1
#define Addop 2
#define Mulop 3
#define Assignop 4
#define Not 5
%}
%%
["<"|">"|"<="|">="|"=="|"!="]* { return Relop; }
["+"|"-"|"||"]* { return Addop; }
["*"|"/"|"%"|"&&"]* { return Mulop; }
["="]* { return Assignop; }
["!"]* { return Not; }
. { return -1; }
%%
int main () {
int token;
while ((token = yylex())) {
switch (token) {
case Relop: printf("Relop: %s\n", yytext); break;
case Addop: printf("Addop: %s\n", yytext); break;
case Mulop: printf("Mulop: %s\n", yytext); break;
case Assignop: printf("Assignop: %s\n", yytext); break;
case Not: printf("Not: %s\n", yytext); break;
default: printf("Error: %s not recognized\n", yytext);
}
}
}
答案 0 :(得分:1)
如评论中所示,问题在于[]
的字符集模式使用不当。这表示一组单个字符。对模式的解释:
["="]*
匹配字符:"
,=
或ε。即不只是等于符号。它也会匹配""""""""""
或==========
模式:
["*"|"/"|"%"|"&&"]*
会匹配字符:"
,*
,|
,%
,&
或ε,而不仅仅是乘法运算符。它也会匹配""""
,||||||||||
等。标记符号|
不代表或。
正确的图案是移除包围,留下可选择的图案。生成的flex程序如下所示:
%{
#include <stdio.h>
#define Relop 1
#define Addop 2
#define Mulop 3
#define Assignop 4
#define Not 5
%}
%%
"<"|">"|"<="|">="|"=="|"!=" { return Relop; }
"+"|"-"|"||" { return Addop; }
"*"|"/"|"%"|"&&" { return Mulop; }
"=" { return Assignop; }
"!" { return Not; }
. { return -1; }
%%
int main () {
int token;
while ((token = yylex())) {
switch (token) {
case Relop: printf("Relop: %s\n", yytext); break;
case Addop: printf("Addop: %s\n", yytext); break;
case Mulop: printf("Mulop: %s\n", yytext); break;
case Assignop: printf("Assignop: %s\n", yytext); break;
case Not: printf("Not: %s\n", yytext); break;
default: printf("Error: %s not recognized\n", yytext);
}
}
}
我写了完整的答案,以帮助那些可能只在it was clear the OP had fixed the error之后让这个普通初学者犯错的人!