antlr4 的小问题:text==null 不知道为什么

问题描述

我有一个已经有效的语法,我重新激活了。 现在它不再起作用了。 重点是两条规则

parseRule 
@init {
   this.targets = new HashSet<Category>();
} // init 
    : (|->)? Name ( Trans '(' parseTargets ')' ) (->|)?
        {
            Category cat = new Category($Name.text);
            if ($startup.text != null) {
                this.carGr.addStart(cat);
            }
            if ($Finish.text != null) {
                this.carGr.addStop(cat);
            }
            this.carGr.addRule(cat,targets);
        }
    ;

很简单,忽略可选部分,我只是解析一个名称和目标如下:

parseTargets : (Name parseTargets?)
        {System.out.println("targets: "+targets);
    System.out.println("name: "+$Name.text);
    if ($Name.text != null){
    this.targets.add(new Category($Name.text));}};

我认为,在解析的每个实例中,Name 都必须存在,因此:$Name.text!=null。 所以我不需要如果。 真相是不同的。 谁能解释一下???

解决方法

如评论中所述,(|->)? 不正确。它可能是 v3 语法的残余:删除它们。此外,还有对不存在的 StartupFinish 规则的引用。以下内容将正确地将 Name 规则的内容打印到您的控制台:

parseRule
 : Name Trans '(' parseTargets ')'
   {
     System.out.println($Name.text);
   }
 ;