Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ANTLR3中编写与“;exp(加上^exp)*";当运算符为空白(两个表达式之间的空格)时_Antlr_Antlr3 - Fatal编程技术网

如何在ANTLR3中编写与“;exp(加上^exp)*";当运算符为空白(两个表达式之间的空格)时

如何在ANTLR3中编写与“;exp(加上^exp)*";当运算符为空白(两个表达式之间的空格)时,antlr,antlr3,Antlr,Antlr3,要解析Excel公式,我需要一个范围交集规则。 例如: = SUM(A1:C4 B2:D3)` 在Excel中相当于: = SUM(B2:C3) (两个区域的交叉点) 规则是: range ( range )* 但是我找不到编写树部分的方法,因为我只找到了如何使用带有^运算符的实际lexer标记来编写树部分,就像添加的一样,它应该是: range (PLUS^ range )* 但是这里的INTERSECT标记是任意的,因为在其他地方空格字符只是空白 我想我需要使用->树语法

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

= 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,我没想到您可以将规则名称用作树属性。。。