【发布时间】:2011-10-05 07:57:46
【问题描述】:
我正在尝试根据此处提供的示例创建异构树:http://www.antlr.org/wiki/display/ANTLR3/Tree+construction#Treeconstruction-Heterogeneoustreenodes
我已经创建了一个语法文件如下:
grammar T;
options {
language=CSharp3;
ASTLabelType=CommonTree;
output=AST;
TokenLabelType=CommonToken;
k=3;
}
tokens {
ROOT;
UNARY_MIN;
}
@lexer::header
{
using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using ANTLRSandbox.Criteria;
}
@parser::header
{
using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using ANTLRSandbox.Criteria;
}
@parser::namespace { ANTLRSandbox }
@lexer::namespace { ANTLRSandbox }
public
parse
: exp EOF -> ^(ROOT<RootNode> exp)
;
exp
: addExp
;
addExp
: mulExp (('+'<PlusNode> | '-'<MinusNode>)^ mulExp)*
;
mulExp
: unaryExp (('*' | '/')^ unaryExp)*
;
unaryExp
: '-' atom -> ^(UNARY_MIN atom)
| atom
;
atom
: Number
| '(' exp ')' -> exp
;
Number
: ('0'..'9')+ ('.' ('0'..'9')+)?
;
Space
: (' ' | '\t' | '\r' | '\n'){Skip();}
;
节点类如下所示:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using Antlr.Runtime;
using Antlr.Runtime.Tree;
namespace ANTLRSandbox.Criteria
{
public class RootNode : CommonTree
{
public RootNode(int ttype) { }
public RootNode(int ttype, IToken t) { }
public RootNode(IToken t) { }
}
}
PlusNode 和 MinusNode 的类与 RootNode 相同,所以我不会在这里发布它们。
这是我创建实际树的方法:
string s = "(12.5 + 56 / -7) * 0.5";
ANTLRStringStream Input = new ANTLRStringStream(s);
TLexer Lexer = new TLexer(Input);
CommonTokenStream Tokens = new CommonTokenStream(Lexer);
TParser Parser = new TParser(Tokens);
TParser.parse_return ParseReturn = Parser.parse();
CommonTree Tree = (CommonTree)ParseReturn.Tree;
代码运行没有任何错误,但是当我“监视”Tree 对象时,它的所有节点都是CommonTree 类型,并且我在PlusNode、MinusNode、RootNode 构造函数中放置的所有断点都是错过了。
我已关注 ANTLR3 wiki 页面中提供的示例,但在网络上找不到任何示例。我知道他们打算在某个时候放弃这种方法(在 ANTLR3 preview notes 上找到了这个)但是这个实现更适合我(我需要根据语法上下文创建不同的对象类型)。
那么……有什么提示吗?我错过了什么吗?一些选项/标志将其放入语法定义文件中?
谢谢! D.
【问题讨论】:
-
我不认为你最终想出了如何让 C# 3 目标生成异构节点,是吗?接受的答案并没有真正回答问题。我遇到了同样的困难。
-
不,运气不好。我最终在
Create方法中使用了带有工厂的树适配器(CommonTreeAdaptor)。
标签: tree antlr nodes antlr3 heterogeneous