当前位置: 首页 > 知识库问答 >
问题:

请Jison忽略一些不必要的细节

寿子默
2023-03-14

我正在使用Jison编写一个解析器,它允许我解析一种相当复杂的表达式语言。在这种语言中,它支持语法,如:

stats_expression
  : stats_function '(' eval_expression ')'
  | other_stats_aggregation
  ;

stats_function
  : SUM
  | AVERAGE
  | ...
  ;

这里的eval_表达式非常复杂(具有嵌套eval、逻辑表达式等功能),我不关心eval_表达式的内容,也不想花费太多精力解析它。我只想获得上述语法中的其他信息,比如stats_函数名。

我的问题是,在Jison中是否有任何方法允许我做一些通配符匹配来轻松匹配整个eval_expression,而无需为eval_expression编写完整的lexer/语法规范?

注意:像使用正则表达式而不是Jison来完成这项工作这样的解决方案对我来说不起作用,因为我需要用我为其编写的整个语法/解析器的语言来解析上面的其他_stats_aggregation部分。

感谢任何帮助。

共有1个答案

马祺
2023-03-14

假设您不需要为任何其他目的完全解析eval_expression(即,它不是表达式的一部分),那么您唯一需要知道的是表达式的终止位置。假设它有平衡括号可能是合理的,所以它将跨越括号平衡的任何令牌序列,可以用以下方式识别:

 balanced_paren_sequence: 
                        | balanced_paren_sequence balanced_paren_object
                        ;

 /* Since jison has no wild cards, you need this complete list */
 balanced_paren_object: '(' balanced_paren_sequence ')'
                      | '+' | '-' | '*' | '/' | ...
                      | `[` | `]` | '{' | '}' | ...
                      | IDENTIFIER | CONSTANT | ...
                      ;

balanced_paren_object的可能RHS列表将包括除and之外的所有语言令牌。如图所示,它包括其他平衡对,如[/]and{/}

您也可以通过添加类似于balanced\u paren\u object的第一个产品的规则来强制实现这些平衡,但这只对改进错误报告有用;如前所述,解析器将接受包含不平衡括号的某些不正确的构造,但由于您没有进行详细的解析,解析器最终还是会接受某些不正确的构造。

您可以将balanced_paren_object的定义内联到balanced_paren_sequence中(事实上,如果只有一种类型的表达式的详细解析树您不需要,您可以使用eval_expression作为非终端的名称);我写它就像上面一样,只是为了清晰。

 类似资料:
  • 项目中经常会生成一些Git系统不需要追踪(track)的文件。典型的是在编译生成过程中 产生的文件或是编程器生成的临时备份文件。当然,你不追踪(track)这些文件,可以 平时不用"git add"去把它们加到索引中。 但是这样会很快变成一件烦人的事,你发现 项目中到处有未追踪(untracked)的文件; 这样也使"git add ." 和"git commit -a" 变得实际上没有用处,同时

  • 我创建了一个小提琴,试图使用字体权重为300的Open Sans字体: HTML语言 CSS公司 我使用谷歌字体来定义CSS 我可以看到Firefox(Ubuntu 13.10)在字体粗细:300(轻量级)和字体粗细:400(正常)下渲染时有所不同,但在Chrome(版本33.0.1750.117)中没有差异,其中所有内容看起来都像是以字体权重:400呈现的。是我做错了什么还是 Chrome 中存

  • 本文向大家介绍java 单例模式容易忽略的细节,包括了java 单例模式容易忽略的细节的使用技巧和注意事项,需要的朋友参考一下 java单例模式 直接讲实现单例模式的两种方法:懒汉式和饿汉式,单例模式的概念自己上网搜吧这里就不讲了! 这里会涉及到java中的jvm,如果你没有这方面的知识,我建议你先去补补,不然会有点迷糊! 首先说说类什么时候进行加载? java虚拟机没有进行强制性的约束,但是对于

  • 我将WireMock作为独立进程启动: Java-jar wiremock-standalone-2 . 6 . 0 . jar-port 8080-v 还行。 当超文本传输协议请求内容后缀时 /api/profile/Favorite/WireMock必须返回存根响应。对所有其他请求必须通过WireMock忽略,并且必须转发到正式服。 我必须如何配置WireMock?

  • 问题内容: 我想写一个像这样的doctest: 有什么办法吗?我认为切换到单元测试会更有意义,但我很好奇是否可以指定不适合doctest中的测试的输出范围。 谢谢! 问题答案: 使用,您可以用来表示“在此处匹配任何字符串”。您可以使用doctest指令设置选项,以使其仅在一个测试用例中处于活动状态:在线文档中的一个示例是: 如果您希望doctest选项始终处于活动状态,则可以将其作为参数传递给您使

  • 问题内容: 我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。 我在代码的2个不同位置使用JSON序列化: 在REST API的响应中。 当代码与Elasticsearch交互时。 我在Elasticsearch中需要一些属性,但我想向应用程序用户隐藏(例如,来自关系数据库的内部ID)。 这是一个实体的例子: 问题 :当对象持久化在Elasticsearc