微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在“主/子”配置中配置yacc解析器

如何解决在“主/子”配置中配置yacc解析器

我以前曾尝试过手写ECMAScript解析器, 从那以后,我意识到如果将它重写为 使用“ yacc”生成的解析器。

但是,要实现所需的ECMAScript“语义”,则需要 减少将触发语义语法的减少 在(通常)“主要” ECMAScript语法中

但是可以在两个解析器之间建立这样的关系吗? 在“ yacc”内?如果是这样,怎么办?

谢谢, 罗素

解决方法

我不确定您用引号引起的“ yacc”到底是什么意思;我认为它不是原始的yacc,但是还有其他多种可能性,并且任何答案都必须特定于某些解析器生成器或其他解析器。

最初的yacc写于一个时代,在这个时代,使用全局变量在组件之间进行通信是很正常的。因此,不幸的是,依赖全局yylval在扫描程序和解析器之间进行通信。较现代的yacc / lex实现开发了避免通常被认为是不良接口设计的机制,但是这些机制都没有将其纳入Posix标准,该标准或多或少地定义了解析器必须提供的最少功能集和扫描仪生成器,至少要使用它们来实现标准的yacclex Shell命令。

作为这种机制的一个具体示例,bison提供了配置指令

%parse-param { type name }

,它将使用给定的类型和名称向yyparse添加一个附加参数。通常,类型将是指向struct的指针,该指针包含共享的解析上下文:名称是您在解析器操作内如何引用参数的方式。 (有关详细信息,请参见the Bison manual。)

Bison还提供了两种机制来在解析器和协作的扫描器之间传递令牌语义值和位置:一种是将指向yylvalyylloc的指针添加为yylex的附加参数。接口(请参见Pure Parsers和flex指令%bison-bridge);另一种方法是反转控制流以创建"push parser",词法分析器为每个令牌调用一次,并将令牌信息作为参数传递。第二种解决方案为解析器和子解析器之间的通信提供了其他可能性,并且常常导致更简洁的设计。

Byacc还提供%parse-param%pure-parser(但不提供推送解析器)。从我所看到的,这些与野牛的设施非常相似。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。