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

时间:2014-12-28 15:23:33

标签: javascript parsing bison flex-lexer jison

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

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

stats_function
  : SUM
  | AVERAGE
  | ...
  ;

这里eval_expression非常复杂(具有嵌套eval,逻辑表达式等功能),我不关心eval_expression的内容,也不想花太多精力解析它。我只想在上面的语法中获取其他信息,例如stats_function name。

我的问题是,如果Jison中有任何方法允许我进行一些通配符匹配以轻松匹配整个eval_expression而无需为eval_expression编写完整的词法分析器/语法规范吗?

注意:使用正则表达式而不是Jison来执行此作业的解决方案对我来说不起作用,因为我需要在语言中解析other_stats_aggregation部分,我也为此编写了整个语法/解析器。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

假设您不需要eval_expression完全解析用于任何其他目的(即,它不属于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列表将包括您的语言中的每个标记,但除外。如图所示,它包括其他平衡对,如 [ / ] { / }

您也可以通过添加类似于balanced_paren_object的第一个制作的规则来强制这些平衡,但这仅对改进错误报告有用;如上所述,解析器将接受涉及不平衡括号的某些不正确的构造,但由于您没有进行详细的解析,因此您的解析器最终将接受某些不正确的构造。

您可以将balanced_paren_object的定义内联到balanced_paren_sequence(实际上,如果只有一种类型的表达式,您可以使用eval_expression作为该非终端的名称解析你不需要的树;我在上面写了一个模糊的尝试,以便清晰。