AstNode (абстрактный базовый класс)
├── CommandNode (командные конструкции)
│ ├── BreakNode
│ ├── ContinueNode
│ ├── ForNode
│ ├── WhileNode
│ ├── DoWhileNode
│ ├── IfNode
│ ├── SwitchNode
│ └── ReturnNode
├── ExpressionNode (выражения)
│ ├── LiteralExpression
│ ├── VariableExpression
│ ├── BinaryExpression
│ ├── UnaryExpression
│ ├── TernaryExpression
│ ├── ArrayExpression
│ ├── MethodCallExpression
│ ├── NewExpression
│ └── MemberAccessExpression
├── ArrayDeclarationNode
├── ClassNode
├── ClassBlockNode
├── FieldNode
├── FreeNode
├── ImportNode
├── InterfaceNode
├── InterfaceBodyNode
├── LabelNode
├── MethodNode
├── ParameterNode
├── VarNode
└── BlockNode (блоки кода)
public class LiteralExpression extends ExpressionNode {
private Object value; // Может быть Number, Boolean, String
public VarType getType() {
if (value instanceof Boolean) return VarType.BOOL;
if (value instanceof Number) return ...; // Автоматический выбор типа
if (value instanceof String) return VarType.CSTR;
return VarType.UNKNOWN;
}
}
Поддерживает все типы литералов: числа, строки, булевы значения.
public class VariableExpression extends ExpressionNode {
private final String value; // Имя переменной
public VarType getType(Scope scope) {
Symbol symbol = scope.resolve(value);
return symbol.getType();
}
}
Обрабатывает доступ к переменным с проверкой области видимости.
public class BinaryExpression extends ExpressionNode {
private ExpressionNode left, right;
private Operator operator; // +, -, *, /, %, &, |, <, > и др.
public VarType getType() {
if (operator.isComparison()) return VarType.BOOL;
return leftType.getSize() >= rightType.getSize()
? leftType : rightType;
}
}
Реализует бинарные операции с проверкой типов и оптимизацией.
public class MethodCallExpression extends ExpressionNode {
private ExpressionNode parent; // null для статических вызовов
private String methodName;
private List<ExpressionNode> arguments;
public VarType getType() {
// Поиск метода в ClassScope с проверкой параметров
}
}
Обрабатывает вызовы методов, включая статические и через объекты.
public class NewExpression extends ExpressionNode {
private String className;
private List<ExpressionNode> args;
public boolean postAnalyze() {
// Проверка существования класса
// Поиск подходящего конструктора
}
}
Реализует создание объектов с проверкой конструкторов.
public class ArrayExpression extends ExpressionNode {
private ExpressionNode array;
private ExpressionNode index;
public VarType getType() {
return arrayType.getElementType(); // Тип элементов массива
}
}
Обрабатывает доступ к элементам массива с проверкой границ.
public ExpressionNode parse() {
return parseAssignment(); // Начинаем с присваивания
}
private ExpressionNode parseAssignment() {
ExpressionNode left = parseBinary(0);
if (есть оператор присваивания) {
return new BinaryExpression(left, operator, parseAssignment());
}
return left;
}
private ExpressionNode parseBinary(int minPrecedence) {
// Рекурсивный спуск с учетом приоритетов операторов
}
private ExpressionNode parseUnary() {
// Обработка унарных операторов (+,-,!,~,++,--)
}
Многоуровневый парсинг с поддержкой приоритетов операторов и оптимизацией.
Реализация AST в компиляторе j8b обеспечивает: