Ответы варьируются между языками. Например, в Java класс может реализовать (наследуйтесь), несколько интерфейсов, но только наследовались одному абстрактному классу. Таким образом, интерфейсы дают Вам больше гибкости. Но это не верно в C++.
Я никогда не работал с ANTLR из C #, но, следуя вашей ссылке на API, BaseTree
явно не интерфейс - это класс , и он имеет общедоступные свойства: Введите
, чтобы получить тип узла, Текст
, чтобы получить (я предполагаю) исходный текст, соответствующий ему, и Дети
, чтобы получить дочерние узлы. Что еще нужно, чтобы пройтись по нему?
Если бы я собирался сегодня сделать компилятор C #, вот что я бы сделал в качестве первой попытки:
member_declaration
для дальнейшего использования. member_declaration
и добавляет его в TypeBuilder
. Следите за телами методов, но пока не углубляйтесь в них. Expression
, соответствующее методу, и используйте CompileToMethod
Если вы выполняете действия в этом порядке, то, когда вы, наконец, анализируете выражения (тела методов, инициализаторы полей), вы можете использовать строку
параметризованные методы , подобные этому , в Класс Expression
для сохранения элементов разрешения работы.
Expression
, соответствующее методу, и используйте CompileToMethod
Если вы выполняете действия в этом порядке, то, когда вы, наконец, анализируете выражения (тела методов, инициализаторы полей), вы можете использовать строку
параметризованные методы , подобные этому , в Класс Expression
для сохранения элементов разрешения работы.
Expression
, соответствующее методу, и используйте CompileToMethod
Если вы выполняете действия в этом порядке, то, когда вы, наконец, анализируете выражения (тела методов, инициализаторы полей), вы можете использовать строку
параметризованные методы , подобные этому , в Класс Expression
для сохранения элементов разрешения работы.
Тип дерева AST можно установить в параметрах грамматики на странице вверху файла примерно так:
tree grammar CSharpTree;
options {
ASTLabelType = CommonTree
}
Я бы построил третью грамматику или включил ее в существующую грамматику парсера, которая превращает дерево в классы, которые вы создаете. Например, предположим, что у вас есть правило, которое соответствует оператору «плюс» и имеет 2 аргумента. Вы можете определить правило, соответствующее этому дереву, которое создает класс, который вы написали, назовем его PlusExpression следующим образом:
plusExpr returns [PlusExpression value]
: ^(PLUS left=expr right=expr) { $value = new PlusExpression($left.value, $right.value); }
expr будет другим правилом в ваших выражениях соответствия грамматики. left и right - это просто псевдонимы, присвоенные значениям дерева. Часть между {} в значительной степени преобразована в код C # дословно, за исключением замены ссылок на переменные. Файл.