Lex - 将运营商视为代币

时间:2012-01-22 23:39:27

标签: c lex

我正在学习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();

}

我得到的错误是警告,规则无法匹配。

我做错了什么?

谢谢

1 个答案:

答案 0 :(得分:1)

我想我看到了问题

[^\t\n\r]             {}
...
[\r\t\n]+               {}
...
\+                    {printf("Keyword: + \n" );}
\<                     {printf("Keyword: < \n");}

+<字符将匹配最高规则([^\t\n\r])和\+ / \<规则。由于它们的长度相同,因此词法分析器会进行第一次匹配[^\t\n\r],因此它将不执行任何操作({}),并且它永远不会与\+ / \<匹配规则,正如它所说。取出[^\t\n\r]规则并将其替换为令牌列表最后的. {}