AST重写规则,在antlr中带有“* +”

时间:2012-12-20 04:17:20

标签: antlr

我在重写规则方面遇到麻烦,无法将解析树转换为antlr中的AST树。

这是我的antlr代码:

grammar MyGrammar;

options {
  output= AST;
  ASTLabelType=CommonTree;
  backtrack = true;
}


tokens {
    NP;
    NOUN;
    ADJ;
}

//NOUN PHRASE
np  :    ( (adj)*  n+ (adj)*  -> ^(ADJ adj)*  ^(NOUN n)+ ^(ADJ adj)* )
    ;


adj : 'adj1'|'adj2';
n   : 'noun1';

当我输入“adj1 noun1 adj2”时,解析树的结果如下:

parse tree

但重写规则之后的 AST树似乎与解析树完全不同,adj是双重的而不是按顺序排列,如下所示:

AST tree

所以我的问题是如何重写规则以获得像上面的解析树那样的结果?

1 个答案:

答案 0 :(得分:2)

你的名词短语规则收集所有形容词并将它们复制到名词的两面,因为ANTLR无法自动区分一组匹配的adj和另一组。{

以下是np规则的细分:

np  :    ( 
           (adj)*  //collect some adjectives
             n+ 
           (adj)*  //collect some more adjectives 
               -> ^(ADJ adj)*  //all adjectives written
                  ^(NOUN n)+   //all nouns written
                  ^(ADJ adj)*  //all adjectives written again
         )
    ;

将两个组分开的一种方法是将它们收集到各自的列表中。以下是适用于规则np的示例:

np  :    ( 
           (before+=adj)*  //collect some adjectives into "before"
             n+ 
           (after+=adj)*  //collect some adjectives into "after"
               -> ^(ADJ $before)*  //"before" adjectives written
                  ^(NOUN n)+   //all nouns copied
                  ^(ADJ $after)*  //"after" adjectives written
         )
    ;

这样,ANTLR知道adj之前和之后要写出的n