我刚开始使用flex,我对这个工具有些担忧。
%{
#include "parser.h"
int line_num = 1;
%}
\n { line_num++; }
%%
在上面的代码中,我只计算扫描文件中的行,对吧?
如何从另一个.c文件中调用line_num值?像这样的功能:
int getLineNumber(void);
而且,我怎么能用这个工具检测词汇错误?我知道它是用“。*”模式但是如何打印它(在另一个.c的函数中再次),如:
printf ("%d: error: %s\n", getLineNumber(), message);
感谢。
答案 0 :(得分:1)
在您显示的代码中,您已经定义了全局变量line_num
。只需在头文件中声明extern int line_num;
,即可在程序中的任何位置访问它。
如果您想避免使用全局变量,请使用以下内容替换扫描仪的开头:
%{
#include "parser.h"
static int line_num = 1;
int getLineNumber(void) {
return line_num;
}
%}
在标题中添加getLineNumber
函数的声明。 (这只是普通的C东西,flex并没有在这里添加任何奇怪的东西。)
对于错误处理,您可以添加如下规则:
. { reportUnrecognizedToken(); }
然后在某处放置这样的函数:
void uncrecognizedToken() {
printf("Unrecognized token on line %d\n", getLineNumber());
exit(1);
}