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

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

stats_function
  : SUM
  | AVERAGE
  | ...
  ;


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

我的问题是,Jison中是否有任何方法可以让我做一些通配符匹配,从而轻松地匹配整个eval_expression,而无需为eval_expression编写完整的词法分析器/语法规范?

注意:像使用正则表达式代替Jison来完成这项工作的解决方案对我来说不起作用,因为我也需要使用上述语言来解析other_stats_aggregation部分,为此我还要为其编写整个语法/解析器。

任何帮助表示赞赏。

最佳答案

假设您不需要出于任何其他目的对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作为该非终结符的名称);我上面写的是模糊的尝试,以使其清晰易读。

关于javascript - 让Jison忽略一些不必要的细节,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27677744/

10-11 18:43