Antlr解析树节点坐标?
Antlr parse Tree node coordinates?
我用的是Antlr4 4.9.2
我需要在分析的不同阶段对同一个解析树执行多次传递。我的应用程序处理的一些文件非常大,因此我希望能够避免将解析树保留在内存中,并且能够每次都重新生成不同的解析树实例。到目前为止一切顺利。
我的挑战是我需要一种方法来 (a) 比较节点和 (b) 快速访问与等效解析树的不同实例一起工作的节点。
例如,以下伪代码生成表示同一文件的解析树的两个独立实例(因此解析树及其节点是等效的)
ParseTree parseTree1 = parse(myFile, myGrammar)
ParseTree parseTree2 = parse(myFile, myGrammar)
由于myFile
和myGrammar
相同,所以parseTree1
和parseTree2
是等价的,但是是不同的实例,不满足Objects.equals()
在 ANTLR 中,我如何以这样的方式表示节点的坐标 C:
- C(node1) = C(node2) 如果节点相等
- 我可以访问 C(parseTree1) 或 C(parseTree2) 而无需访问解析树 - 因此对于解析树的任何实例,我都可以快速将自己定位在同一节点上
您可以使用 ANTLR4's XPath 实现来直接访问给定解析树路径中的节点。下面是我如何在 MySQL 代码中获取所有查询表达式,解析后:
const expressions = XPath.findAll(tree, "/query/simpleStatement//queryExpression", this.parser);
我用的是Antlr4 4.9.2
我需要在分析的不同阶段对同一个解析树执行多次传递。我的应用程序处理的一些文件非常大,因此我希望能够避免将解析树保留在内存中,并且能够每次都重新生成不同的解析树实例。到目前为止一切顺利。
我的挑战是我需要一种方法来 (a) 比较节点和 (b) 快速访问与等效解析树的不同实例一起工作的节点。
例如,以下伪代码生成表示同一文件的解析树的两个独立实例(因此解析树及其节点是等效的)
ParseTree parseTree1 = parse(myFile, myGrammar)
ParseTree parseTree2 = parse(myFile, myGrammar)
由于myFile
和myGrammar
相同,所以parseTree1
和parseTree2
是等价的,但是是不同的实例,不满足Objects.equals()
在 ANTLR 中,我如何以这样的方式表示节点的坐标 C:
- C(node1) = C(node2) 如果节点相等
- 我可以访问 C(parseTree1) 或 C(parseTree2) 而无需访问解析树 - 因此对于解析树的任何实例,我都可以快速将自己定位在同一节点上
您可以使用 ANTLR4's XPath 实现来直接访问给定解析树路径中的节点。下面是我如何在 MySQL 代码中获取所有查询表达式,解析后:
const expressions = XPath.findAll(tree, "/query/simpleStatement//queryExpression", this.parser);