让吉森忽略一些不必要的细节



我正在使用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 作为该非终端的名称);我把它写成上面,模糊地试图清晰易读。

相关内容

  • 没有找到相关文章

最新更新