Архитектура AST парсера языка j8b

Ключевые особенности реализации:

Базовые компоненты AST

Иерархия узлов:

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 (блоки кода)

Система выражений

1. Базовые выражения

LiteralExpression

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;
    }
}

Поддерживает все типы литералов: числа, строки, булевы значения.

VariableExpression

public class VariableExpression extends ExpressionNode {
    private final String value; // Имя переменной
    
    public VarType getType(Scope scope) {
        Symbol symbol = scope.resolve(value);
        return symbol.getType();
    }
}

Обрабатывает доступ к переменным с проверкой области видимости.

2. Операции и вызовы

BinaryExpression

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;
    }
}

Реализует бинарные операции с проверкой типов и оптимизацией.

MethodCallExpression

public class MethodCallExpression extends ExpressionNode {
    private ExpressionNode parent; // null для статических вызовов
    private String methodName;
    private List<ExpressionNode> arguments;
    
    public VarType getType() {
        // Поиск метода в ClassScope с проверкой параметров
    }
}

Обрабатывает вызовы методов, включая статические и через объекты.

3. Специальные конструкции

NewExpression

public class NewExpression extends ExpressionNode {
    private String className;
    private List<ExpressionNode> args;
    
    public boolean postAnalyze() {
        // Проверка существования класса
        // Поиск подходящего конструктора
    }
}

Реализует создание объектов с проверкой конструкторов.

ArrayExpression

public class ArrayExpression extends ExpressionNode {
    private ExpressionNode array;
    private ExpressionNode index;
    
    public VarType getType() {
        return arrayType.getElementType(); // Тип элементов массива
    }
}

Обрабатывает доступ к элементам массива с проверкой границ.

Особенности парсинга выражений

ExpressionNode - ядро парсинга

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 обеспечивает:

← Назад к главной странице