我已经设置了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>
答案 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"
%}
free
和malloc
错误来自于之前包含stdlib.h
的生成的扫描程序(以及从flex中遗漏#include <stdlib.h>
序言)。与=
的语法错误来自于bison将使用标记的值自动生成enum
,并且您的宏定义会导致枚举在语法上不正确。
注意:告诉bison生成头文件很重要;您可以使用-d
命令行选项执行此操作。在任何使用令牌名称的文件中,该头文件需要#include
d。 (通常情况下,这只是扫描仪,但偶尔会有其他翻译单位也需要它。)
头文件的名称取决于源文件的名称和调用bison的方式;我不知道Windows上的工作方式,但我通常使用-o
选项为生成的.c
文件提供显式名称,如果这样做,则头文件将包含同名,.c
替换为.h
。