// Creare uno scanner che legge dallo stream di input passato a noi CSLexer lexer = nuovo CSLexer (nuovo ANTLRFileStream (f)); tokens.TokenSource = lexer;Compilare il proprio compilatore C# utilizzando ANTLR: Compilation Unit
// Create a parser that reads from the scanner
CSParser parser = new CSParser(tokens);
// start parsing at the compilationUnit rule
CSParser.compilation_unit_return x = parser.compilation_unit();
object ast = x.Tree;
Che cosa posso fare con la x che è di tipo compilation_unit_return, per estrarre la sua radice, le classi, i suoi metodi, ecc? Devo estrarre la sua scheda? Come lo faccio? Si noti che il compilation_unit_return è definito come tale nel mio CSParser (che viene generato automaticamente da ANTLR):
public class compilation_unit_return : ParserRuleReturnScope
{
private object tree;
override public object Tree
{
get { return tree; }
set { tree = (object) value; }
}
};
Tuttavia l'albero sto ottenendo è del tipo di oggetto. Corro usando il debugger e sembra vedere che è del tipo BaseTree. Ma BaseTree è un'interfaccia! Non so come si riferisce a BaseTree e non so come estrarre i dettagli da questo albero. Ho bisogno di scrivere un visitatore che visita la sua classe, metodo, variabili .... La classe ParserRuleReturn si estende da RuleReturnScope e ha un oggetto start e stop, che non so cosa sia ... Inoltre , c'è questa classe TreeVisitor fornita da ANTLR che sembra poco chiara. Richiede che un adapter passi come parametro al suo costruttore (se non userà il CommonTreeAdaptor predefinito), per questo ho chiesto ad abt come ottenere il paraorecchie dell'adapter. E anche altri problemi ... Per l'API, puoi fare riferimento a http://www.antlr.org/api/CSharp/annotated.html
Ora sono colpito qui ... Se sai qualcosa, aiutami. Grazie mille.
È una classe astratta ... classe astratta pubblica BaseTree: ITree – yeeen
Ebbene sì, e perché dovrebbe fermarti? Hai il nodo radice dell'albero, che sai essere di un tipo che ha tutti i metodi necessari per recuperare i suoi figli (e quindi camminare l'albero a qualsiasi profondità). –