使用Flex计算线条

时间:2014-08-09 20:54:43

标签: c flex-lexer

我刚开始使用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);

感谢。

1 个答案:

答案 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);
}