Antlr3:为限定名称构建解析树

Antlr3: building parse tree for qualified names

我找不到 question/answer 可以帮助解决我的问题。因此,我在这里发布这个问题。

我正在尝试为限定名称构建解析树。下面的例子显示了一个例子。

例如,

  1. foo_boo.aaa.ccc1_c

这里我用点分隔词。我正在使用 antlr3,下面是我的语法。

parse
    :  expr
    ;


list_expr : <I removed the grammar here>
SimpleType : ('a'..'z'|'A'..'Z'|'_')('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
           ;

QualifiedType : SimpleType | SimpleType ('\.' SimpleType)+;


expr : list_expr
    | QualifiedType
    | union_expr;

/*------------------------------------------------------------------
 * LEXER RULES
 *------------------------------------------------------------------*/

WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { $channel = HIDDEN; } ;

这里,SympleType代表一个词的语法。我的要求是为 QualifiedType 构建语法。上面给出的当前语法没有按预期工作 (QualifiedType : SimpleType | SimpleType ('\.'SimpleType)+;)。 如何为限定名称(点分隔词)编写正确的语法?

使 QualifiedType 成为解析器规则而不是词法分析器规则:

qualifiedType : SimpleType ('.' SimpleType)*;

此外,'\.' 不需要转义:'.' 可以。

编辑

您必须设置 the output to AST and apply some tree rewrite rules 才能使其正常工作。这是一个快速演示:

grammar T;

options {
  output=AST;
}

tokens {
  Root;
  QualifiedName;
}

parse
 : qualifiedType EOF -> ^(Root qualifiedType)
 ;

qualifiedType
 : SimpleType ('.' SimpleType)* -> ^(QualifiedName SimpleType+)
 ;

SimpleType
 : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')*
 ;

如果您现在 运行 代码:

import org.antlr.runtime.*;
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.DOTTreeGenerator;
import org.antlr.stringtemplate.StringTemplate;

public class Main {
    public static void main(String[] args) throws Exception {
        TLexer lexer = new TLexer(new ANTLRStringStream("foo_boo.aaa.ccc1_c"));
        TParser parser = new TParser(new CommonTokenStream(lexer));
        CommonTree tree = (CommonTree)parser.parse().getTree();
        DOTTreeGenerator gen = new DOTTreeGenerator();
        StringTemplate st = gen.toDOT(tree);
        System.out.println(st);
    }
}

你会得到一些DOT output,对应如下AST: