0

我正在使用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我编写整个语法/解析器的语言来解析上面的部分。

任何帮助表示赞赏。

4

1 回答 1

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 | ...
                      ;

可能的 RHS 列表balanced_paren_object将包括您的语言中的每个标记,除了()。如图所示,它包括其他平衡对,例如[/]{/ }

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

您可以内联balanced_paren_objectinto的定义balanced_paren_sequence(实际上,eval_expression如果只有一种类型的表达式您不需要其详细的解析树,您可以将其用作该非终端的名称);我把它写在上面是为了清晰易读。

于 2014-12-28T15:58:32.393 回答