// Создайте сканер, который читает из переданного нам входного потока CSLexer lexer = новый CSLexer (новый ANTLRFileStream (f)); tokens.TokenSource = lexer;Создание собственного компилятора C# с использованием ANTLR: Компиляционный модуль
// 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;
Что я могу сделать с х, имеет тип compilation_unit_return, чтобы извлечь его корень, его классы, его методы и т.д.? Должен ли я извлечь свой адаптер? Как мне это сделать? Обратите внимание, что compilation_unit_return определяется как таковой в моем CSParser (который автоматически генерируется ANTLR):
public class compilation_unit_return : ParserRuleReturnScope
{
private object tree;
override public object Tree
{
get { return tree; }
set { tree = (object) value; }
}
};
Однако дерево я получаю от типа объекта. Я запускаю использование отладчика и, похоже, вижу, что он имеет тип BaseTree. Но BaseTree - это интерфейс! Я не знаю, как это относится к BaseTree и не знает, как извлечь данные из этого дерева. Мне нужно написать посетителя, который посетил его класс, метод, переменные .... Класс ParserRuleReturn распространяется от RuleReturnScope и имеет объект начала и остановки, который я не знаю, что это такое ... Кроме того, , этот класс TreeVisitor предоставлен ANTLR, который выглядит запутанным. Для этого требуется переход Адаптера в качестве параметра к его конструктору (если он не будет использовать стандартный CommonTreeAdaptor), поэтому я спросил, как получить адаптер для подключения адаптера. И другие вопросы тоже ... Для API, можно обратиться к http://www.antlr.org/api/CSharp/annotated.html
Теперь я поражен здесь ... Если вы действительно ничего знаете, помогите нам помочь. Бесконечно благодарен.
Это абстрактный класс ... Публичный абстрактный класс BaseTree: ITree – yeeen
Ну да, и почему это остановит вас? У вас есть корневой узел дерева, который, как вы знаете, имеет тип, который имеет все методы, необходимые для извлечения своих детей (и, таким образом, перемещение дерева на любую глубину). –