在项目中处理多个Flex/Bison解析器的最佳方法是什么?
我写了一个解析器,现在我需要在同一个项目中使用第二个解析器.到目前为止,在parser1.y我插入main(..)方法的第三部分并yyparse从那里调用.
我想获得是一种有两个不同的解析器(什么parser1.y和parser2.y),并能够从外部函数中使用它们(让我们假设main在main.cpp).
我应该使用哪些预防措施来导出文件yyparse外的函数.y以及如何处理两个解析器?
PS.我正在使用g ++编译而不是Flex和Bison的C++版本,我想保持这种方式(因此避免将解析器封装在对象中).
我读到的与这些实用程序有关的大多数帖子通常都建议使用其他方法来获得相同的效果.例如,通常提到这些工具的问题至少有一个答案包含以下一些内容:
假设开发人员......
所以我的问题是:
我正在设计要在禁止使用动态内存的嵌入式环境中运行的软件。Lex和Yacc非常适合该应用程序。
我可以配置Lex和Yacc完全不使用动态内存分配吗?
是否可以将Lex和Yacc配置为使用预定义的内存块,并将动态内存使用限制为该预定义的空间?
是否可以将动态内存的使用限制为仅对程序进行初始化(即程序首次运行时)?
编辑: 作为对TonyK的响应,我希望解析器不使用动态内存。
谢谢
我已经读过Xcode 4(我想以前的版本)内置了对Yacc和Lex的支持,我正在学习.我正在尝试建立一个简单的项目来测试它们,但由于我是Xcode和Yacc/Lex的新手,我似乎无法找到正确的方法.
任何人都可以推荐在Xcode 4中使用Yacc/Lex的有用指南或教程吗?
我试图使用PLY库中为Python提供的yacc解析器来解析字符串.解析器本身很长,但我遇到的问题是它总是给我同样的错误,无论我放什么样的字符串.错误是这样的:
yacc:输入中的解析错误.EOF
而词法分析器运行完美,所以我认为解析器就是问题所在.但我不明白这个错误,所以我甚至不知道在哪里首先要解决这个问题
有任何想法吗?非常感谢你!
这是我在skener.y文件中的代码
%{
#include <stdio.h>
%}
%token T_Int
%%
exp: T_Int { $$ = $1; }
| exp exp '+' { $$ = $1 + $2; }
| exp exp '-' { $$ = $1 - $2; }
| exp exp '*' { $$ = $1 * $2; }
| exp exp '/' { $$ = $1 / $2; }
;
%%
Run Code Online (Sandbox Code Playgroud)
当我用命令“ bison -d skener.y”进行编译时,出现错误“ m4:无此类文件或目录”。当然,在提示符下键入命令时,我位于工作文件夹中。我不知道是关于什么的?
我正在努力学习YACC并且在弄清楚它给我的警告信息时遇到了一些麻烦.这是我的文件的一部分:
define_character: WORD IS STRING COLOR
{
printf("%s's full name is %s and thier color is %s", $1, $3, $4);
};
dialog: WORD COLON STRING
{
printf("%s says %s", $1, $3);
};
change_scene: SCENE SETSCENE WORD
{
printf("%s is the new scene", $3);
};
Run Code Online (Sandbox Code Playgroud)
它给我的警告是:
2 rules never reduced
2 useless nonterminals and 2 useless rules
warning: useless nonterminal: dialog
warning: useless nonterminal: change_scene
warning: useless rule: dialog: WORD SEMICOLON STRING
warning: useless rule: change_scene: SCENE SETSCENE WORD
Run Code Online (Sandbox Code Playgroud)
我该如何解决这些问题?我试过搜索,我发现由于转移/减少冲突而导致错误的人.似乎YACC通常会将其添加到警告输出中,如果有的话,只是为了确保我尝试从change_scene中删除WORD,这样它就不会寻找任何与其他令牌相同的令牌,但它仍然没有减少.我可以测试所有的规则,因为无论哪个都在顶部是有效的.我在第一条规则的末尾错过了一些语法,导致其余的问题?
我正在使用yacc和lex与Visual Studio 2012 C++/CLI并为yacc源文件创建了一个自定义构建步骤,如下图所示

输出文件有两个依赖项.它们是yacc源文件icl5kyacc.y和yyparse.c模板文件.每次构建解决方案时,即使尚未修改yyparse.c和icl5kyacc.y源文件,也会运行自定义构建步骤.这是构建后的目录列表.
21-Sep-2012 10:19:18p 28,210 A icl5kyacc.y
17-Sep-2012 7:32:06p 9,042 A yyparse.c
22-Sep-2012 11:43:56a 38,233 A ICL5KYACC.cpp
22-Sep-2012 11:43:56a 2,160 A icl5kyacc.h
Run Code Online (Sandbox Code Playgroud)
再次建造之后
2>从icl5kyacc.y生成icl5kyacc.cpp
21-Sep-2012 10:19:18p 28,210 A icl5kyacc.y
17-Sep-2012 7:32:06p 9,042 A yyparse.c
22-Sep-2012 11:45:46a 38,233 A ICL5KYACC.cpp
22-Sep-2012 11:45:46a 2,160 A icl5kyacc.h
Run Code Online (Sandbox Code Playgroud)
我错误地认为使用自定义构建步骤应该在构建步骤的输入和输出文件之间自动应用标准依赖关系规则吗?我很好奇的一件事是Studio(附加依赖项)中为我提供的%(AdditionalInputs)宏.不知道那是什么,或者是否以某种方式指向正在修改的文件.
我知道这是有原因的,但我还没有找到一个好的、简洁的解释来解释为什么 LEX/YACC 不能用于 C++。我也有兴趣知道 LEX/YACC 是否可以用来解析 Objective C,或者该语言是否遇到同样的问题。(请注意,我指的是 ObjC,而不是 Obj-C++。)谢谢。
我们不知道如何跟踪 yacc 解析器中的错误。yylineno我们尝试在 lex 文件中使用并尝试添加%option yylineno,但它仍然不起作用,我们无法在 yacc 中访问这些变量。
error我们想要的只是使用yacc 和行号打印出语法错误。
这是我们的.l文件
%{
#include <stdio.h>
#include <stdlib.h>
#include "y.tab.h"
int yylineno=1;
%}
%option yylineno
identifier [a-zA-Z_][a-zA-Z0-9_]*
int_constant [0-9]+
delimiter ;
%%
"int" {return INT;}
{int_constant} return INT_CONST;
{identifier} return IDENT;
\= {return ASOP;}
\+ {return PLUS;}
\- {return MINUS;}
\* {return MULT;}
\/ {return DIV;}
\, {return COMMA;}
\( {return OP;} /*OP CP = Opening Closing Parenthesis*/
\) {return CP;}
\[ {return OB;} /*OB …Run Code Online (Sandbox Code Playgroud) yacc ×10
bison ×5
lex ×4
parsing ×3
c++ ×2
c ×1
dependencies ×1
embed ×1
flex-lexer ×1
msbuild ×1
objective-c ×1
ply ×1
python ×1
xcode ×1
xcode4 ×1