我正在学习lex和乌龟语言 我遇到问题让lex将运算符识别为令牌+,< ,=
我将它们存储在一个文件中 我试过这样做
\+ or "+" or '+' or [+]
我使用单引号没有任何错误,但它不匹配它或者我是否需要在文件中执行此操作?。
这是我的档案
fd 3x00
bk
setc 100
int xy3 fd 10 rt 90
rt
lt
setxy
setx
sety
home
seth
pd
pu
ht
st
color
xcor
ycor
heading
random
:=
+
<
这是程序
%{
#include <stdio.h>
#include <stdlib.h>
int number;
%}
%%
fd {printf("Keyword %s\n", yytext);}
[^\t\n\r] {}
[0-9]+[a-z]+[0-9]+ {printf("Illegal: 3x00\n");}
[\r\t\n]+ {}
bk {printf("Keyword: %s\n", yytext);}
setc {printf("Keyword: %s\n", yytext);}
[0-9]+ {printf("Number: %s\n", yytext);}
int {printf(" Keyword: %s\n", yytext);}
xy3 {printf("ID: %s\n", yytext);}
fd[0-9]+ {printf("Keyword: %s\n", yytext);
printf("Number %s\n", yytext);}
rt {printf("Keyword: %s\n", yytext);}
lt {printf("Keyword: %s\n",yytext);}
setxy {printf("Keyword: %s\n", yytext);}
setx {printf("Keyword: %s\n", yytext);}
sety {printf("Keyword: %s\n", yytext);}
home {printf("Keyword: %s\n", yytext);}
seth {printf("Keyword: %s\n", yytext);}
pd {printf("Keyword: %s\n", yytext);}
pu {printf("Keyword: %s\n", yytext);}
ht {printf("Keyword: %s\n", yytext);}
st {printf("Keyword: %s\n", yytext);}
color {printf("Keyword: %s\n", yytext);}
xcor {printf("Keyword: %s\n", yytext);}
ycor {printf("Keyword: %s\n", yytext);}
heading {printf("Keyword: %s\n", yytext);}
random {printf("Keyword: %s\n", yytext);}
:= {printf("Keyword: =\n" );}
\+ {printf("Keyword: + \n" );}
\< {printf("Keyword: < \n");}
%%
main( int argc,char** argv)
{
if(argc > 1)
{
FILE *file;
file = fopen(argv[1], "r");
if(!file)
{
fprintf(stderr, "Could not open %s \n", argv[1]);
exit(1);
}
yyin = file;
}
yylex();
}
我得到的错误是警告,规则无法匹配。
我做错了什么?
谢谢
答案 0 :(得分:1)
我想我看到了问题
[^\t\n\r] {}
...
[\r\t\n]+ {}
...
\+ {printf("Keyword: + \n" );}
\< {printf("Keyword: < \n");}
+
和<
字符将匹配最高规则([^\t\n\r]
)和\+
/ \<
规则。由于它们的长度相同,因此词法分析器会进行第一次匹配[^\t\n\r]
,因此它将不执行任何操作({}
),并且它永远不会与\+
/ \<
匹配规则,正如它所说。取出[^\t\n\r]
规则并将其替换为令牌列表最后的. {}
。