0

我正在编写一个词法分析器,代码如下:

%{
#include <stdio.h>
void showToken(char*);
%}

%%
int main(){
void showToken(char* name){
        printf("<%s,%s>",name,yytext);
}
return 0;
}
%%

我得到以下信息:

~/hedor1>cc -c -o lexical.o lexical.c
lexical.l:40: error: expected identifier or â(â before â%â token

我找不到问题出在哪里,而且我必须在代码部分中写:

int main(){}

如果我不写上面的 main 函数会发生什么?

4

1 回答 1

0

主要问题

Lex (Flex) 分析器中只能有两条%%线。

...definitions...
%%
...lexical patterns...
%%
...everything else...

Lex 和 Flex 程序只需将第二个%%逐字记录后的文件内容复制到生成的 C 代码中。而C在任何时候都不喜欢%%

挑剔

您不应该像尝试使用的那样将函数嵌套在彼此内部:

int main(){
void showToken(char* name){
        printf("<%s,%s>",name,yytext);
}
return 0;
}

您需要main()showToken(). (有一个 GCC 特定的扩展允许嵌套函数。不要使用它。)


此外,当您在错误消息中有行号时,插入注释以识别源代码中的行会很有帮助。或者描述被识别的线。但是我们不应该计算代码中的行数,即使错误在第 1 行......好吧,也许第 1-3 行不是太关键,但是有一个模糊断点,之后识别行是重要的。到了十几岁的时候,已经接近必不可少了;前 5 行可能并不重要;在 (6-12) 之间,通常最好指明行号。

于 2012-11-10T15:36:57.027 回答