c - 调试词法分析器问题

标签 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

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

int main(){}

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

最佳答案

主要问题

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) 之间,通常最好指明行号。

关于c - 调试词法分析器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13323307/

相关文章:

c - scanf() 在 c 中使用两个输入进行验证

c 复制 ptr 的第一个字母

makefile - Make 添加意外的 mv 命令

pattern-matching - 自然语言理解算法

c - 在 C 中实现双堆栈以在命令行上计算数学表达式。(段错误)

C Flex 代码调试

c - 使用 makefile 从 lex 文件生成 a.out

lex - 使用 Lex/Yacc 识别汉字中的标识符

javascript - 点符号的点是运算符还是其他?你怎么知道?

f77 未格式化二进制文件的内容