当运算符是 whitespace(两个表达式之间的 space)时,如何在 ANTLR3 中编写等同于“exp (PLUS^ exp)*”

How to write in ANTLR3 the equivalent of " exp ( PLUS^ exp)* " when the operator is a whitespace (space between two expressions)

要解析 Excel 公式,我需要一个范围交集规则。 例如:

= SUM(A1:C4 B2:D3)`     

在Excel中等价于:

= SUM(B2:C3)

(2个区域的交集)

规则是:

range ( range )*

但我找不到编写树部分的方法,因为我只找到了如何使用带有 ^ 运算符的实际词法分析器标记来完成它,就像添加一样,它将是:

range (PLUS^ range )* 

但这里的 INTERSECT 标记是任意的,因为在别处 space 字符只是白色的space.

我想我需要使用 -> 树语法,但我无法在 ANTLR3 指南或网络上找到如何用 [=17= 编写 range (PLUS^ range )* 的等价物] 句法。 这是我目前的尝试:

range ( range {hasIntersect=true})* 
-> {hasIntersect}? ^(INTERSECT range*)
-> range

我为 A1:C4 B2:D3 工作,但对于 A1:C4 B2:D3 B1:B6 它生成一棵具有 3 children 的 INTERSECT 树而不是 2 棵具有 2 children 的 INTERSECT 树,就像它会用于另一个操作。

当然我需要这棵树只有 2 children...

这有点棘手,因为它有效地构建了一个递归结构,但它甚至可以在一个规则中完成:

my_rule:
    (
        r1=range
        -> $r1
    )
    (   (
            r2=range
            -> ^(INTERSECT $my_rule $r2)
        )
    )*

这里的关键部分是 $rule 引用(名称与规则名称相同),它将包含到目前为止由重写规则生成的 AST。