我的lex代码中有一些错误,也许有人知道我做错了什么。。。
16 %%
17 {ws} {/*no action and no return */}
18 {}
19 {newline} {lineo++;}
20 {number} {tokenval=atoi(yytext); return(NUM);}
21 {id} {
22 int p = 0;
23 p = lookup(yytext);
24 if (p == 0)
25 p = insert (yytext, ID);
26 tokenval = p;
27 return symtable[p].token;
28
29 }
30
31 <<EOF>> {return DONE;}
32 {tokenval = NONE; return yytext[0];}
33
34
35 %%
我是这类技术的新手,我花了很多时间,但没有任何积极的结果。控制台出现以下错误:
new.l:21: unrecognized rule
new.l:28: unrecognized rule
new.l:28: unrecognized rule
new.l:36: EOF encountered inside an action
new.l:36: unrecognized rule
new.l:36: fatal parse error
make: *** [lex.yy.c] Error 1
当我删除那几行糟糕的代码时(第21-32行),我得到了错误:
new.l:19:2:错误:"lineo"未声明(此函数中首次使用){换行符}{lineo++;}
-
第18行(
{}
)是错误的;flex会将其视为一种模式,而不是一种行动。 -
你可能想写
lineno
(也就是说,一种键入"Line Nº"的方式,这是"行号"的缩写。)但你在哪里声明了吗?还是您打算使用yylineno
? -
你定义了
{id}
吗?错误消息表明您没有,但您没有粘贴定义。 -
在第32行中,默认规则的模式为
.
:. {tokenval = NONE; return yytext[0];}
-
你读过方便的flex手册吗?
除上述内容外,作为对第3点的替代,定义为:
id {letter}({letter} | {digit})*
是不正确的,因为正则表达式不能包含未加引号的空格。你需要把它写成
id {letter}({letter}|{digit})*