antlr - Antlr 中 "* +"的 AST 重写规则

标签 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

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

最佳答案

您的名词短语规则会收集所有形容词并将它们复制到名词的两侧,因为 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 就知道在 n 之前和之后要写出哪些 adj

关于antlr - Antlr 中 "* +"的 AST 重写规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13965243/

相关文章:

java - 如何在ANTLR中找到children上下文的children?

antlr - 如何解析带括号的层次结构根?

java - 如何使用 ANTLR v4 标记代码

ANTLR4 ATN 代表什么?

c# - 我可以将 ANTLR 用于未预处理的代码吗?

javascript - 如何编写以下标准的语法 - ANTLR4 语法 - 自定义表达式

java - 在简单的整数列表语法中使用 AntLR4 中的访问者

Antlr 使用复合语法在 Antlrworks 中未定义导入

java - 如何忽略不重要的节点?

java - ANTLR 4 (Java) 捕获解析器错误/异常以进行测试