gpt4 book ai didi

linux - Ubuntu 14.04 上的 lex 中无法识别的规则

转载 作者:太空宇宙 更新时间:2023-11-04 10:57:59 24 4
gpt4 key购买 nike

我试图让 lex 使用 echo 吐出程序中的保留字,但我继续收到以下错误:

    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 创建的用于扫描器的 token 文件:

#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 是一个特殊的语句,只能在 Action 部分使用。

参见 http://dinosaur.compilertools.net/flex/manpage.html

关于linux - Ubuntu 14.04 上的 lex 中无法识别的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28143517/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com