【发布时间】:2015-10-22 17:39:01
【问题描述】:
我正在尝试完成有关制作词法分析器的作业,但每次尝试使用 flex 制作 lex.cc.y 文件时都会收到此错误:
"fofo.l", line: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);
}
}
}
【问题讨论】:
-
[]的含义需要重新阅读手册
-
好吧,我能够在一段时间后解决问题,但由于某种原因,我得到“Realop”作为这两个“!”的输出和“=”字符,而我应该分别得到“Not”和“Assignop”。我也碰巧将减号“-”视为无法识别。
-
您是否弄清楚 [] 的含义以及为什么不应该像现在这样使用它们?
-
我们使用 [] 运算符定义了一类字符。它说有例外,例如“\^-”字符,其中“-”定义了一个范围。因此,为了使用“-”作为字符,我们需要在开头或结尾键入它。但是它仍然对我不起作用。
-
"!=" 是四个字符,其中一个是重复的。我不认为那是你想要的。
标签: flex-lexer