Parsing 在同一个应用程序中是否可能有两个或多个Lex/Yacc解析器

Parsing 在同一个应用程序中是否可能有两个或多个Lex/Yacc解析器,parsing,bison,yacc,lex,flex-lexer,Parsing,Bison,Yacc,Lex,Flex Lexer,我有一个应用程序,其中我已经有了一种语法的解析器,我需要为另一种目的添加另一种不同的语法 有可能不止一个吗 如果是这样,你如何获得另一个切入点 谢谢 大卫·艾伦·芬奇(david allan finch)我想你可以通过使用Bison的--name prefix选项和Flex的--prefix选项来实现这一点 在这两种情况下,它们都允许您将生成的函数上使用的默认“yy”前缀替换为您自己选择的前缀。是的,这是可能的 yacc应该有一个-p标志,您可以在其中指定不同的前缀,而不是默认的“yy” lex

我有一个应用程序,其中我已经有了一种语法的解析器,我需要为另一种目的添加另一种不同的语法

有可能不止一个吗

如果是这样,你如何获得另一个切入点

谢谢


大卫·艾伦·芬奇(david allan finch)

我想你可以通过使用Bison的
--name prefix
选项和Flex的
--prefix
选项来实现这一点

在这两种情况下,它们都允许您将生成的函数上使用的默认“
yy
”前缀替换为您自己选择的前缀。

是的,这是可能的

yacc应该有一个-p标志,您可以在其中指定不同的前缀,而不是默认的“yy”

lex conatins生成的文件在外部仅使用了一个符号:yylex。
你可以用-DyLeX= MySudiLeX编译,例如:

不是直接的答案,但是你可能想考虑使用一种更通用的方法,比如允许你使用一个通用引擎来处理从语法生成的LALR和DFA表。


通过这种方式,您可以在同一个应用程序中使用任意数量的不同语法,并且更改语法不会创建新的源代码,而只是创建新的表文件(可以作为嵌入式资源或类似资源包含)。

标准lex和yacc无法做到这一点。Flex和Bison也一样,其他一些实现也是如此。既然你(在评论中)说你没有使用flex和bison,你使用的是lex和yacc的哪些版本?

我使用的是lex和yacc,但如果我们改为免费版本,这很好。谢谢达维特鲁。若他们唯一能让它工作的方法就是使用flex和bison。我们将有足够的钱来使用它们。我刚刚检查了makefiles,发现我们正在使用flex和bison。我需要检查一下,但这正是我需要的。谢谢,戴夫。我希望你的yacc版本有这个标志。否则,你可以切换到bison,这并没有什么不同。它们的符号像yytext等(yywrap?)不是也在外面使用吗?我们不能在mo改变系统,但可能是一个可以在未来研究的符号。感谢dave。POSIX要求yacc支持使用“-p prefix”(代替“yy”)更改符号前缀。有趣的是,对于莱克斯来说,这并不需要这些;我假设在实践中,许多人手工编写词法分析器,因此它不是那么重要。