我正在尝试将Antlr用于一些类似IDE的函数 - 专门解析文件以识别代码折叠的点,以及应用语法高亮.
第一个问题 - Antlr是否适合此要求,还是过度杀伤?这可以使用正则表达式和/或手动解析器来实现......但似乎Antlr在那里为我做这项工作.
我有过一看......和优秀的教程资源在这里.
我已经设法建立了一个Java语法(使用标准语法),并将所有内容整齐地解析为树.但是,我希望看到嵌套在树中的元素.事实上,一切都是最重要元素的孩子.
例如.鉴于:
package com.example
public class Foo {
String myString = "Hello World"
// etc
}
Run Code Online (Sandbox Code Playgroud)
我原本期望Foo的树节点是包声明的节点的子节点.同样,myString将是Foo的孩子.
相反,我发现Foo并且myString(以及其他所有事情)都是孩子的package.
这是解析的相关摘录:
public void init() throws Exception {
CharStream c = new ANTLRFileStream(
"src/com/inversion/parser/antlr/Test.code");
Lexer lexer = new JavaLexer(c);
CommonTokenStream tokens = new CommonTokenStream(lexer);
JavaParser parser = new JavaParser(tokens);
parser.setTreeAdaptor(adaptor);
compilationUnit_return result = parser.compilationUnit();
}
static final TreeAdaptor adaptor = new CommonTreeAdaptor() {
public Object create(Token payload) {
if (payload != null)
{
System.out.println("Create " + JavaParser.tokenNames[payload.getType()] + ": L" + payload.getLine() + ":C" + payload.getCharPositionInLine() + " " + payload.getText());
}
return new CommonTree(payload);
}
};
Run Code Online (Sandbox Code Playgroud)
检查result.getTree()返回一个CommonTree实例,其子项是解析的结果.
预期价值(可能不正确)
package com.example (4 tokens)
|
+-- public class Foo (3 tokens)
|
+--- String myString = "Hello World" (4 tokens)
+--- Comment "// etc"
Run Code Online (Sandbox Code Playgroud)
(或类似的东西)
实际值(所有值都是根节点的子节点result.getTree())
package
com
.
example
public
class
Foo
String
myString
=
"Hello World"
Run Code Online (Sandbox Code Playgroud)
我对这应该如何正确的理解是什么?
到目前为止,我是Antlr的一个完整的菜鸟,我发现学习曲线非常陡峭.
antlr.org上文件共享部分顶部的Java-6语法不包括树构建.你需要做两件事.首先,告诉ANTLR您要构建AST:
options {
output=AST;
}
Run Code Online (Sandbox Code Playgroud)
其次,您需要通过使用树运算符或使用重写规则来告诉它树的外观.请参阅树构造的文档.我通常最终会将两者结合起来.
| 归档时间: |
|
| 查看次数: |
2895 次 |
| 最近记录: |