// Erstellen Sie einen Scanner, der aus dem uns übermittelten Datenstrom liest CSLexer lexer = neuer CSLexer (neuer ANTLRFileStream (f)); tokens.TokenSource = Lexer;Erstellen eines eigenen C# -Compilers mit ANTLR: Kompilierungseinheit
// 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;
Was kann ich mit dem x tun, die von compilation_unit_return Typ ist, die Wurzel zu extrahieren, ihre Klassen, die Methoden usw.? Muss ich den Adapter herausziehen? Wie mache ich das? Beachten Sie, dass die compilation_unit_return als solche in meinem CSParser definiert ist (die automatisch von ANTLR generiert wird):
public class compilation_unit_return : ParserRuleReturnScope
{
private object tree;
override public object Tree
{
get { return tree; }
set { tree = (object) value; }
}
};
Doch der Baum Ich erhalte vom Typ Objekt ist. Ich laufe mit dem Debugger und schien zu sehen, dass es vom Typ BaseTree ist. Aber BaseTree ist eine Schnittstelle! Ich weiß nicht, wie es sich auf BaseTree bezieht und weiß nicht, wie man Details aus diesem Baum herausholt. Ich muss einen Besucher schreiben, der Besuch in seiner Klasse, Methode, Variablen .... Die ParserRuleReturn-Klasse erstreckt sich von RuleReturnScope und hat ein Start-und Stop-Objekt, das ich nicht weiß, was es ist ... Darüber hinaus , gibt es diese TreeVisitor-Klasse, die von ANTLR zur Verfügung gestellt wird, die verwirrend aussieht. Es erfordert, dass ein Adapter als Parameter an seinen Konstruktor übergeben wird (wenn nicht, wird es den Standard-CommonTreeAdaptor verwenden), weshalb ich gefragt habe, wie man den Adapter-E-Mail-Server erhalten soll. Und andere Probleme auch ... Für die API können Sie sich beziehen auf http://www.antlr.org/api/CSharp/annotated.html
Jetzt bin ich hier geschlagen ... Wenn Sie etwas wissen, bitte helfen Sie. Tausend Dank.
Es ist eine abstrakte Klasse ... öffentliche abstrakte Klasse BaseTree: ITree – yeeen
Nun ja, und warum würde es dich stoppen? Sie haben den Wurzelknoten des Baumes, von dem Sie wissen, dass er einen Typ hat, der alle Methoden hat, um seine Kinder abzurufen (und so den Baum in jede Tiefe zu führen). –