ANTLR C#如何从树中获取特定节点?

时间:2014-03-26 09:28:50

标签: c# parsing tree antlr antlr3

我正在解析文本文件。我使用 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();

这个编译,但我不知道下一步要去哪里挖掘。

你有什么建议吗?

0 个答案:

没有答案