我正在解析文本文件。我使用 ANTLRWorks 编写和检查语法以及 theantlrguy.atlassian.net 中的 ANTLR3 C#工具来编译语法。
此时我可以构建AST并将所有节点打印到控制台(通过递归获取子节点) 但是,我想根据我的令牌获取特定节点。
例如我有一个节点参数,其子名称。节点名称依次有一个孩子“Johnny” 在我的应用程序中,我想要一个对象参数,其字段为 string Name =“Johnny”。
我发现树语法是从AST获取节点所必需的,所以我写了一个。但是,我找不到使用它的方法。
以下是组合语法中的选项和示例(简化) Lexer和Parser规则:
options {
language=CSharp3;
TokenLabelType=CommonToken;
output=AST;
ASTLabelType=CommonTree; }
tokens {
StatementT;
ParameterT;
NameT; }
statement : object -> ^(StatementT object);
object : name -> ^(ParameterT name);
name : NAME -> ^(NameT NAME);
以下是树语法(选项和简化规则)中的部分:
options {
language=CSharp3;
tokenVocab=myGrammar;
ASTLabelType=CommonTree; }
statement : ^(StatementT object);
object : ^(ParameterT name);
name : ^(NameT NAME);
以下是源代码的一部分:
ANTLRStringStream input = new ANTLRStringStream(inputString);
myGrammarLexer lexer = new myGrammarLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
myGrammarParser parser = new myGrammarParser(tokens);
var result = parser.statement();
CommonTree tree = (CommonTree)result.Tree;
正如我搜索过的那样,走树会出现以下代码:
CommonTreeNodeStream nodes = new CommonTreeNodeStream(tree);
nodes.TokenStream = tokens;
myTreeGrammar walker = new myTreeGrammar(nodes);
walker.statement();
这个编译,但我不知道下一步要去哪里挖掘。
你有什么建议吗?