-1

在以下代码中,它是 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
4

1 回答 1

1

您的正则表达式中有几个问题:

第 13 行,实际上错误在第 12 行,不要在 RE 中添加空格,它会破坏表达式并且无法按预期工作:

letter(letter|digit)*             showToken("id");

第 17 行,the+是一个特殊字符,所以用 : 转义它\

(\+|-)                   showToken("addop");

第 18 行,与字符*和相同/

(\*|\/)                   showToken("mulop");

第 21 行,同|

(\|\|)                    showToken("or");

这应该可以修复编译错误,但请注意下面@JameySharp 的评论,您可能希望使用花括号编写digitand引用:和.letter{digit}{letter}

于 2012-11-09T16:24:29.710 回答