Compiler errors lex{lineo+;+;}中无法识别的规则错误
我的莱克斯密码有一些错误,也许有人知道我做错了什么Compiler errors lex{lineo+;+;}中无法识别的规则错误,compiler-errors,lex,cc,Compiler Errors,Lex,Cc,我的莱克斯密码有一些错误,也许有人知道我做错了什么 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
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 %%
当我删除了那些不好的代码行(第21-32行)时,我得到了以下错误:
new.l:19:2:错误:“lineo”未声明(首次在此函数中使用)
{newline}{lineo++;}
{}
)完全错了;flex会将其视为一种模式,而不是一种行为lineno
(也就是说,输入“Line N:”的一种方式,它是“Line number”的缩写),但是你在什么地方声明了吗?或者您是否打算使用yylineno
{id}
?错误消息表明您没有粘贴定义,但您没有粘贴定义
:
。{tokenval=NONE;返回yytext[0];}
id {letter}({letter} | {digit})*
不正确,因为正则表达式不能包含无引号的空格。你需要把它写成
id {letter}({letter}|{digit})*
这是我的全部代码:。我试图做一些改变,但我仍然不知道它是如何工作的。我使用本手册来调整:可能不是新版本,但仍然有效;)@Epredator:我又添加了一个错误来纠正。另外,由于您定义的函数
lexan
没有显式返回类型,因此您的最终代码块无效C
;它可能应该被编写成int-lexan(){return yylex();}
,但是它是多余的,因为您可以直接调用yylex
。这本手册确实是针对旧版本的,我建议使用更新的版本,比如我链接的版本。但应该没问题。
id {letter}({letter}|{digit})*