在Ubuntu 14.04的lex中无法识别的规则

我试图让lex使用回声吐出一个程序中的保留字,但我仍然得到以下错误:

scanner.l:30: unrecognized rule scanner.l:30: unrecognized rule scanner.l:70: unrecognized rule scanner.l:70: unrecognized rule scanner.l:70: unrecognized rule scanner.l:71: unrecognized rule scanner.l:71: unrecognized rule 

以下是我的lex扫描器代码:

 %{ #include <stdio.h> #include <ctype.h> #include "tokens.h" %} ws [ \t\r\n]+ quoted \".*\" letter [A-Za-z] digit [0-9] word {letter}+(\-{letter}+)? number {digit}+ punc [,:;()] begin { ECHO; } boolean { ECHO; } else { ECHO; } end { ECHO; } endif { ECHO; } function { ECHO; } if { ECHO; } is { ECHO; } integer { ECHO; } real { ECHO; } returns { ECHO; } then { ECHO; } %% {begin} { return(begin); } {boolean} { return(BOOLEAN); } {else} { return(ELSE); } {end} { return(END); } {endif} { return(ENDIF); } {function} { return(FUNCTION); } {if} { return(IF); } {is} { return(IS); } {integer} { return(INTEGER); } {real} { return(REAL); } {returns} { return(RETURNS); } {then} { return(THEN); } "&&" { return(LOGOPAND); } "||" { return(LOGOPOR); } "!=" { return(LOGOPNOT); } [ \t\n] ; {ws} { ECHO; } "<" { ECHO; return(RELOP); } "=" { ECHO; return(RELOP); } "/=" { ECHO; return(RELOP); } ">" { ECHO; return(RELOP); } ">=" { ECHO; return(RELOP); } "<=" { ECHO; return(RELOP); } "*" { ECHO; return(MULTOP); } "/" { ECHO; return(MULTOP); } "+" { ECHO; return(ADDOP); } "-" { ECHO; return(ADDOP); } "true" { ECHO; return(BOOLLITERAL); } "false" { ECHO; return(BOOLLITERAL); } {digit} { ECHO; return(I_LITERAL); } {digit}+"."{digit}* { ECHO; return(R_LITERAL); } begins { ECHO; return(BEGINS); } {punc} { ECHO; return yytext[0]; } {quoted} { ECHO; } {word} {toTitle(yytext, yyleng); } {number} { ECHO; } %% int main() { yylex(); } 

这是我为lex创build的用于扫描器的标记文件:

 #ifndef TOKENS_H #define TOKENS_H typedef enum Tokens {RELOP = 256, ADDOP = 257, MULTOP = 258, LOGOPNOT = 259, BOOLLITERAL = 260, I_LITERAL = 261, R_LITERAL = 262, IDENTIFIER = 263, PUNCTUATION = 264, BEGINS = 265, BOOLEAN = 266, ELSE = 267, END = 268, ENDIF = 269, FUNCTION = 270, IF = 271, IS = 272, INTEGER = 273, REAL = 274, RETURNS = 275, THEN = 276, LOGOPAND = 277, LOGOPOR = 278, begin = 279} Tokens; #endif 

最后,我有一个case.c文件与它一起使用:

 #include <stdio.h> #include <ctype.h> #include "tokens.h" extern int yylex(); extern int yyleng(); extern int yylineno; extern char* yytext; void toTitle(char* yytext, int yyleng) { putchar(toupper(yytext[0])); int i; for (i = 1; i < yyleng; i++) putchar(toupper(yytext[i])); } int main() { while (yylex()); return 0; } 

为什么我会得到这些错误? 我相信这很简单。 谢谢。

正如错误消息所示:错误在第30行中的定义部分中定义您的标记。

  begin { ECHO; } 

如果用一些有意义的标记定义(也许是“开始”)替换这个标记,那么对于后面的等效定义,将会得到相同的错误信息。

ECHO是一个特殊的声明,只能在操作部分使用。

请参阅http://dinosaur.compilertools.net/flex/manpage.html