下面的代码是C语言的词法识别器:
%{
#include <stdio.h>
void showToken(char*);
%}
%option yylineno
%option noyywrap
digit ([0-9])
letter ([a-zA-Z])
%%
letter(letter | digit)* showToken("id");
(digit)(digit)*(.(digit)(digit)*)? showToken("num");
[(),:;.] printf("%c",yytext[0]);
[ \n]
(==|<>|<|<=|>|>=) showToken("relop");
(+|-) showToken("addop");
(*|/) showToken("mulop");
(=) showToken("assign");
(&&) showToken("and");
(||) showToken("or");
(!) showToken("not");
. {
printf("Lexical Error");
exit(0);
}
%%
void showToken(char* name){
printf("<%s,%s>",name,yytext);
}
%%
我收到以下错误,为什么会发生这种情况我认为我编写的代码是正确的! 我对代码做了太多更改,但它无法编译。
~/hedor>lex -t lexical.l > lexical.c
lexical.l:13: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:17: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:18: unrecognized rule
lexical.l:21: unrecognized rule
lexical.l:21: unrecognized rule
lexical.l:21: unrecognized rule
lexical.l:21: unrecognized rule
最佳答案
您的正则表达式存在几个问题:
第13行,实际上错误在第12行,不要在RE中添加空格,它会破坏表达式并且无法按预期工作:
letter(letter|digit)* showToken("id");
第17行,+
是一个特殊字符,所以用\
转义:
(\+|-) showToken("addop");
第18行,与字符*
和/
相同:
(\*|\/) showToken("mulop");
第21行,与|
相同:
(\|\|) showToken("or");
这应该可以修复编译错误,但请注意下面 @JameySharp 的评论,您可能希望使用大括号编写 digit
和 letter
引用: {数字}
和 {字母}
。
关于C Flex 代码调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13311724/