我的Flex代码必须单独无效才能与Bison一起使用吗?

时间:2019-07-04 07:09:04

标签: bison flex-lexer

每个教程都仅以Flex lexer开始。然后他们介绍了野牛。我可以运行Flex并运行Bison并进行很好的编译-我已经为此编写了一个Shell脚本-但是我是否也不能仅从Flex生成和编译?还是我必须放弃?

忽略我的野牛有很多错误。一些来源包括:

<tab>{FLA}  {yylval.midi = midi(yytext[1],yytext[0],1) ; return FLA;}

错误“对yylval的引用未定义。并且:

#include "y.tab.h"

无法找到.h文件。我开始在编译脚本中加入sed regex来生成一个kinder .l文件,从而忽略了这些有问题的东西,然后可以将其转换为C代码并单独进行编译,以便跟踪我在解析器旁边开发的词法分析器我的记号。

这是人们做的事情吗?是否有其他方法可以使Flex代码本身保持有效?还是人们只是放弃了?

1 个答案:

答案 0 :(得分:0)

是的,您可以独立运行flex代码,出于某些目的,flex生成的那种有限状态机是完成这项工作的理想工具,不需要任何其他东西(如上下文无关的语法解析器)。我给我的学生提供的一个示例是,处理一些简单的通信数据包可能只需要一个有限状态机,而不是对其进行手工编码 * ,只需使用诸如flex之类的工具即可。

但是,当同时使用flex和bison时,我认为在与bison组件分开的flex组件上执行单​​元测试是一种很好的软件工程实践。当您首先摇摇词法分析器时,它节省了调试时间。我在这里教我的学生的技术是使用 C 宏和条件编译来分离依赖于野牛的代码。其他人可能有他们喜欢的其他机制。

让我们举个例子。假设您有一种简单的语言,其中包含整数常量和标识符,它们会通过yylval传递回解析器,如您的问题所示。我这样做:

%{
#ifdef PRINT
#define TOKEN(token) printf("Token: " #token ": %s\n", yytext)
#else
#define TOKEN(token) yylval=SymbolTable(yytext); return(token)
#endif
%}

identifier       [a-zA-Z][0-9a-zA-Z]*
number           [0-9]+

%%

{identifier}     TOKEN(ID);
{number}         TOKEN(NUMBER);

然后,我可以通过以下方式构建独立版本:

flex sample.l
gcc -o lexer.exe lex.yy.c -lfl -DPRINT

* 我假设您知道有限状态机只是循环内的一个开关...

while (not <<EOF>>) do {
  switch (state) {

   state1:   ... break;

 }
}