非空闭包和问号:只有第一个元素放入AST?

时间:2011-06-02 12:26:25

标签: antlr antlr3 antlrworks

我被一种奇怪的现象所困扰:

只有x中的z: x | '<'! y? '>'中的第一个y: x (','! x)*,其中b: a a*; c: d b? d;出现在生成的AST中。但只有当我使用在maven存储库中部署的Antlr3编译代码时。使用AntlrWorks,我看到了一个正确的树。

variables : annotatedVariable -> ^(VARIABLES annotatedVariable) | v='<' annotatedVariableList? '>' -> ^(VARIABLES[$v] annotatedVariableList?) ; annotatedVariableList : annotatedVariable (','! annotatedVariable)* ; try_ : v='try' e1=expression 'of' v1=variables '->' e2=expression 'catch' v2=variables '->' e3=expression -> ^(TRY[$v] $e1 $v1 $e2 $v2 $e3) ; 在语义上是错误的吗?我究竟做错了什么?或者Antlr中只是一个错误?

如果你需要一个更完整的例子(我的问题出现在try _的$ v2中):

{{1}}

(完整的源代码和示例输入文件:https://gist.github.com/1004329。树中只有catch中的T,但我在AntlrWorks中看到T和R..

1 个答案:

答案 0 :(得分:1)

  

凯写道:

     

只有z中的第一个x:x | '&LT;'! ÿ? '&gt;',其中y:x(','!x)*出现在生成的AST中。但只有当我使用在maven存储库中部署的Antlr3编译代码时。使用AntlrWorks,我看到了正确的树。

ANTLRWorks生成一个解析树,你的解析器规则产生的AST(假设你在谈论ANTLRWorks的解释器)。

一个简单的测试表明一切正常(使用ANTLR v3测试):

grammar T;

options {
  output=AST;
}

z : x 
  | '<'! y? '>'!
  ;

y : x (','! x)*
    ;

x : X
  ;

X : 'A'..'Z'
  ;

将解析输入:

<X,Y,Z>

进入以下AST:

enter image description here

你可以自己测试一下:

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;

public class Main {
  public static void main(String[] args) throws Exception {
    TLexer lexer = new TLexer(new ANTLRStringStream("<X,Y,Z>"));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    CommonTree tree = (CommonTree)parser.z().getTree();
    DOTTreeGenerator gen = new DOTTreeGenerator();
    StringTemplate st = gen.toDOT(tree);
    System.out.println(st);
  }
}
  

凯写道:

     

b:a *; c:d b? d;语义错误?

没有。但这个问题与您的z: x | '<'! y? '>'规则有关吗?很抱歉,但你有点模糊。

  

凯写道:

     

我做错了什么?

我不知道。你必须在SO上发布一个简短的,自包含的例子,就像我发布的那样。我并不热衷于关注外部链接并涉及数百行代码,抱歉。