Flex 表达式警告,无法匹配规则
Flex Expression warning, rule cannot be matched
我正在尝试完成有关制作词法分析器的作业,但每次尝试使用 flex:
制作 lex.cc.y 文件时,我总是收到此错误
"fofo.l", line:13 warning rule cannot be matched.
"fofo.l", line:14 warning rule cannot be matched.
%{
#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);
}
}
}
如评论中所述,问题出在[]
的字符集模式使用不当。这表示一组 单个 字符。图案解读:
["="]*
将匹配字符:"
、=
或 ε。即不只是等号。它还会匹配 """"""""""
或 ==========
模式:
["*"|"/"|"%"|"&&"]*
将匹配字符:"
、*
、|
、%
、&
或 ε 而不仅仅是乘法运算符。它还会匹配 """"
、||||||||||
等。棒状符号 |
不会代表 或 .
正确的模式是删除括号,留下模式选择。生成的 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);
}
}
}
我写了完整的答案是为了帮助那些可能在 ! [ 之后才犯了这个初学者常见错误的人=27=]
我正在尝试完成有关制作词法分析器的作业,但每次尝试使用 flex:
制作 lex.cc.y 文件时,我总是收到此错误"fofo.l", line:13 warning rule cannot be matched.
"fofo.l", line:14 warning rule cannot be matched.
%{
#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);
}
}
}
如评论中所述,问题出在[]
的字符集模式使用不当。这表示一组 单个 字符。图案解读:
["="]*
将匹配字符:"
、=
或 ε。即不只是等号。它还会匹配 """"""""""
或 ==========
模式:
["*"|"/"|"%"|"&&"]*
将匹配字符:"
、*
、|
、%
、&
或 ε 而不仅仅是乘法运算符。它还会匹配 """"
、||||||||||
等。棒状符号 |
不会代表 或 .
正确的模式是删除括号,留下模式选择。生成的 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);
}
}
}
我写了完整的答案是为了帮助那些可能在