Я пытаюсь создать гетерогенное дерево на основе приведенного здесь образца: 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, и не смог найти ни одного образца в Интернете. Я знаю, что в какой-то момент они намерены отказаться от этого подхода (нашел это в примечаниях к предварительному просмотру ANTLR3), но эта реализация мне больше подходит (мне нужно создавать разные типы объектов на основе контекста грамматики).
Итак... есть намеки? Я что-то упускаю? Какой-то вариант/флаг, чтобы поместить его в файл определения грамматики?
Спасибо! Д.
CommonTreeAdaptor
) с фабрикой в методеCreate
. - person dcg   schedule 23.07.2012