当运算符是 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。
要解析 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。