如何在ANTLR3中编写与“;exp(加上^exp)*";当运算符为空白(两个表达式之间的空格)时
要解析Excel公式,我需要一个范围交集规则。 例如:如何在ANTLR3中编写与“;exp(加上^exp)*";当运算符为空白(两个表达式之间的空格)时,antlr,antlr3,Antlr,Antlr3,要解析Excel公式,我需要一个范围交集规则。 例如: = SUM(A1:C4 B2:D3)` 在Excel中相当于: = SUM(B2:C3) (两个区域的交叉点) 规则是: range ( range )* 但是我找不到编写树部分的方法,因为我只找到了如何使用带有^运算符的实际lexer标记来编写树部分,就像添加的一样,它应该是: range (PLUS^ range )* 但是这里的INTERSECT标记是任意的,因为在其他地方空格字符只是空白 我想我需要使用->树语法
= SUM(A1:C4 B2:D3)`
在Excel中相当于:
= SUM(B2:C3)
(两个区域的交叉点)
规则是:
range ( range )*
但是我找不到编写树部分的方法,因为我只找到了如何使用带有^
运算符的实际lexer标记来编写树部分,就像添加的一样,它应该是:
range (PLUS^ range )*
但是这里的INTERSECT标记是任意的,因为在其他地方空格字符只是空白
我想我需要使用->
树语法,但我在ANTLR3指南或web上找不到如何使用->
语法编写与范围(加^range)*
等效的代码。
以下是我目前的尝试:
range ( range {hasIntersect=true})*
-> {hasIntersect}? ^(INTERSECT range*)
-> range
我为A1:C4 B2:D3
工作,但对于A1:C4 B2:D3 B1:B6
它会生成一个包含3个子项的相交树,而不是像其他操作一样,生成两个分别包含2个子项的相交树
当然,我需要树只有两个子树…这有点棘手,因为它可以有效地构建递归结构,但即使在一个规则中也可以做到:
my_rule:
(
r1=range
-> $r1
)
( (
r2=range
-> ^(INTERSECT $my_rule $r2)
)
)*
这里的关键部分是
$rule
引用(名称与规则名称相同),它将包含迄今为止由重写规则生成的AST。完美。所有单元测试现在都通过了:)多亏了Paris,我没想到您可以将规则名称用作树属性。。。