调试词法分析器问题

时间:2012-11-10 15:23:23

标签: c flex-lexer lexical-analysis

我在写一个词法分析器,这里是代码:

%{
#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

我无法找到问题所在,而且我必须在CODE SECTION中写道:

int main(){}

如果我不写上面的主要功能会怎样?

1 个答案:

答案 0 :(得分: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)之间,通常最好指出行号。