标签: parse-tree

ANTLR v4,JavaLexer和JavaParser将null作为解析树返回

我正在使用antlr v4来提取java程序的解析树以用于其他目的.我从这个样本开始:ANTLR v4访客样本

我已经测试了给定链接上的步骤,以检查它是否有效以及一切正常:

java Run
a = 1+2
b = a^2
c = a+b*(a-1)
a+b+c
^Z
Result: 33.0
Run Code Online (Sandbox Code Playgroud)

然后我编写了自己的解析java程序如下面的结构:

|_Java.g4                                                               
|_Java.tokens                                                           
|_JavaBaseVisitor.java                                                  
|_JavaLexer.java                                                        
|_JavaLexer.tokens                                                      
|_JavaParser.java                                                       
|_JavaTreeExtractorVisitor.java                                         
|_JavaVisitor.java           
|_Run.java 
Run Code Online (Sandbox Code Playgroud)

Run.java如下:

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;

public class Run {
    public static void main(String[] args) throws Exception {
        CharStream input = CharStreams.fromFileName("F:\\Projects\\Java\\Netbeans\\ASTProj\\JavaTreeExtractor\\prog.java");
        JavaLexer lexer = new JavaLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        JavaParser parser = new JavaParser(tokens);
        ParseTree tree = parser.getContext();

        JavaTreeExtractorVisitor calcVisitor = new JavaTreeExtractorVisitor();
        String result = calcVisitor.visit(tree);
        System.out.println("Result: …
Run Code Online (Sandbox Code Playgroud)

java visitor abstract-syntax-tree parse-tree antlr4

7
推荐指数
1
解决办法
539
查看次数

在解析树的一元和二元减

我正在创建一个包含类似于的表达式的解析树

3 - 4 * 8

要么

8 * -5

要么

-(10 * 1)

我需要一种方法来区分一元和二元减.我的语法现在的方式是二进制减去第一个,但我想改变它并添加一个保存最后一个变量的标志变量.

例如:如果是的话 5 - 6

该标志持有5,如果它看到减号并且标志是数字,则跳过一元并转到二进制.

但是我不确定如何在C++中实现它

任何帮助将不胜感激.

谢谢

c++ binary-operators operator-precedence parse-tree unary-operator

6
推荐指数
1
解决办法
4137
查看次数

NLTK树数据结构,查找节点,它的父节点或子节点

我使用nltk的Tree数据结构来处理parsetree字符串.

from nltk.tree import Tree
parsed = Tree('(ROOT (S (NP (PRP It)) (VP (VBZ is) (ADJP (RB so) (JJ nice))) (. .)))')
Run Code Online (Sandbox Code Playgroud)

但是,数据结构似乎有限.是否可以通过它的字符串值获取节点然后导航到顶部或底部?

例如,假设您想要获取字符串值为"nice"的节点,然后查看其父节点,子节点等是什么.是否可以通过nltk的树实现?

python tree nltk parse-tree

6
推荐指数
1
解决办法
1万
查看次数

从 CYK 算法生成解析树

我使用CYK算法(已在 Java 中实现)来查看字符串是否根据特定语法进行识别。现在我需要为字符串生成一个解析树,是一种从使用算法时使用的矩阵生成树的方法吗CYK

parsing parse-tree context-free-grammar cyk

6
推荐指数
1
解决办法
2700
查看次数

如何将令牌流变成解析树

我构建了一个词法分析器,该词法分析器从输入流中输出令牌,但是我不确定如何构建该过程的下一步-解析树。是否有人有很好的资源或如何做到这一点的例子?

parsing token lexical-analysis parse-tree

5
推荐指数
1
解决办法
6083
查看次数

绘制解析树的工具?

有人有一个很好的工具来绘制由上下文无关语法产生的解析树吗?有这个问题,但它专门处理有限自动机而不是解析树。我一直在使用 graphviz,但是必须单独标记每个节点等有点烦人。

graphviz parse-tree context-free-grammar

5
推荐指数
1
解决办法
3万
查看次数

R中函数解析树的冗余

在R,我注意到的解析树function运营商似乎是在这个意义上,它的第四个要素是看似总是由前三个元素的冗余.

例如,

> as.list(substitute(function(x = 1){x^2}))
[[1]]
`function`

[[2]]
[[2]]$x
[1] 1


[[3]]
{
    x^2
}

[[4]]
function(x = 1){x^2}
Run Code Online (Sandbox Code Playgroud)

我注意到的一件事是第四个元素确实存储了输入函数的格式.

> as.list(substitute(function(x = 1){
+ x^2})[[4]]
function(x = 1){
x^2}
Run Code Online (Sandbox Code Playgroud)

解析树中第四个元素的目的是什么?我唯一能看到它被使用的是你想要逐字打印一个函数,你已经可以通过打印函数来完成,例如

> f = function(x = 1){
+ x^2}
> f
function(x = 1){
x^2}
Run Code Online (Sandbox Code Playgroud)

r parse-tree

5
推荐指数
1
解决办法
168
查看次数

从LLVM解析树重新生成源代码?

我很好奇是否有任何项目可以采用LLVM解析树并从中重新生成源代码.我特别想到C/C++.

c c++ llvm clang parse-tree

5
推荐指数
1
解决办法
3613
查看次数

TurboParser的依赖解析输出是什么意思?

我一直在尝试使用CMU的TurboParser生成的依赖解析树.它完美无瑕.然而,问题在于文档很少.我需要准确理解解析器的输出.例如,句子" 我解决了统计问题. "生成以下输出:

1   I           _   PRP PRP _   2   SUB
2   solved      _   VBD VBD _   0   ROOT
3   the         _   DT  DT  _   4   NMOD
4   problem     _   NN  NN  _   2   OBJ
5   with        _   IN  IN  _   2   VMOD
6   statistics  _   NNS NNS _   5   PMOD
7   .           _   .   .   _   2   P
Run Code Online (Sandbox Code Playgroud)

我没有找到任何可以帮助理解各列所代表的内容的文档,以及如何创建倒数第二列(2,0,4,2,...)中的索引.另外,我不知道为什么有两列专门用于词性标签.任何帮助(或外部文档的链接)都将提供很大帮助.

PS如果你想试试他们的解析器,这是他们的在线演示.

PPS请不要建议使用斯坦福的依赖解析输出.我对线性编程算法感兴趣,这不是斯坦福的NLP系统所做的.

nlp parse-tree

5
推荐指数
2
解决办法
1558
查看次数

我可以在ANTLR中将ParseTree"转换"为CommonTree吗?

我想构造一个ParseTree的子树,但是唯一包含insertChild(index,Object)方法的类似乎是CommonTree,我不能传递一个RuleContext类型对象,因为它尝试将它转换为Tree对象,然后我得到" java.lang.ClassCastException:Java8Parser $ ClassDeclarationContext无法强制转换为org.antlr.runtime.tree.Tree"异常.

有任何想法吗?谢谢.(编辑:添加代码)

private void getSubtrees(ParseTree tree){
    CommonTree commonTree = new CommonTree();
    setRecursiveDescendants(commonTree, tree);
}

private CommonTree setRecursiveDescendants(CommonTree commonTree,ParseTree parseTree){
    int n = parseTree.getChildCount();
        for (int i = 0; i < n; i++) {
            commonTree.insertChild(i, parseTree.getChild(i);
            setRecursiveDescendants(commonTree, parseTree.getChild(i));
        }
        return commonTree;
}
Run Code Online (Sandbox Code Playgroud)

java parse-tree antlr4

5
推荐指数
0
解决办法
522
查看次数