VS2010,flex&没有行号的野牛,重新定义和语法错误

时间:2015-07-31 12:01:45

标签: c visual-studio-2010 bison flex-lexer

我已经设置了flex和bison,想出了如何使它们正常工作,并且还清除了大量的错误,这些错误使它成为生成的代码,现在我确信剩下的3个错误不是我的故障:

#line

文件parser.tab.c大约有1600行,所以我不想在整个文件中查找可疑的'='。它还使用%{ #include "lex.yy.c" #include "stdlib.h" #define E_IDENTIFIER 300 #define E_FUNCTION 301 int currentBrackets = 0; %} %token E_FUNCTION E_IDENTIFIER %% expression: E_IDENTIFIER {return E_IDENTIFIER;} %% 指令重定向到我自己文件中的代码(之前甚至不知道它存在),所以它会像以前一样抱怨我自己的文件。

正如我所说,没有行号,字段是空的,这就是我在这里避难的原因,我不知道哪里可以看。双击错误也没有做任何事情。这不是我的安装问题,我在C#和XNA中打开了另外两个项目,它们表现得很好。

到目前为止,Flex和Bison给了我一个非常艰难的时间,所以我迫不及待地想让它们正确编译。

编辑:野牛档案

<Image x:Name="image">
    <Image.Source>
        <BitmapImage UriSource="img1.png"/>
    </Image.Source>
</Image>

1 个答案:

答案 0 :(得分:1)

以下是一些问题。

%{

/* This is wrong. Do not include the lexer in the parser.
 * Compile it separately and link the two files together. */
#include "lex.yy.c"

/* Should be <stdlib.h>, and needs to come before any other code */
#include "stdlib.h"

/* Bison will define these symbols; you shouldn't do so. And
 * you particularly shouldn't do so as macros because Bison
 * defines them as enums. */
#define E_IDENTIFIER 300
#define E_FUNCTION 301

int currentBrackets = 0;
%}

所以你的野牛序言应该是这样的:

%{
   #include <stdio.h>
   #include <stdlib.h>

   int currentBrackets = 0;
%}

你的flex prolog需要包含bison生成的 header 文件。

%{
   #include <stdio.h>
   #include <stdlib.h>

   // See note
   #include "parser.tab.h"
%}

freemalloc错误来自于之前包含stdlib.h的生成的扫描程序(以及从flex中遗漏#include <stdlib.h>序言)。与=的语法错误来自于bison将使用标记的值自动生成enum,并且您的宏定义会导致枚举在语法上不正确。

注意:告诉bison生成头文件很重要;您可以使用-d命令行选项执行此操作。在任何使用令牌名称的文件中,该头文件需要#include d。 (通常情况下,这只是扫描仪,但偶尔会有其他翻译单位也需要它。)

头文件的名称取决于源文件的名称和调用bison的方式;我不知道Windows上的工作方式,但我通常使用-o选项为生成的.c文件提供显式名称,如果这样做,则头文件将包含同名,.c替换为.h