我在重写规则方面遇到麻烦,无法将解析树转换为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”时,解析树的结果如下:
但重写规则之后的 AST树似乎与解析树完全不同,adj是双重的而不是按顺序排列,如下所示:
所以我的问题是如何重写规则以获得像上面的解析树那样的结果?
答案 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
。