О проекте
Учебный компилятор для языка I, разработанный в рамках курса Compilers Construction. Проект охватывает разбор исходного кода, построение абстрактного синтаксического дерева и генерацию представления для LLVM.Возможности языка
- Императивный структурированный язык с явным вызовом подпрограммы для начала выполнения.
- Объявления переменных, пользовательских типов и подпрограмм.
- Области видимости: сущность доступна от места объявления до конца блока.
- Примитивные типы
integer,real,booleanиstring, а также массивы, записи и пользовательские типы. - Условия, циклы, операции, вызовы подпрограмм, ввод-вывод и управление выполнением.
AST
Абстрактное синтаксическое дерево построено вокруг базового узла ASTNode:
ASTNode
├── Expression
│ ├── IntegerLiteral, RealLiteral, BooleanLiteral, StringLiteral
│ ├── Identifier
│ ├── BinaryOp, UnaryOp
│ ├── ArrayAccess, FieldAccess
│ └── RoutineCallExpr
├── Statement
│ ├── VarDecl, TypeDecl, RoutineDecl
│ ├── Assignment, IfStatement, WhileLoop, ForLoop
│ ├── PrintStatement, ReadStatement
│ └── ReturnStatement, BreakStatement, ContinueStatement
└── Type
├── PrimitiveType (integer, real, boolean, string)
├── ArrayType, RecordType
└── UserDefinedTypeПример программы
type Point is record
var x : integer
var y : integer
end
routine AddPoints(a : Point; b : Point) : Point is
var result : Point
result.x := a.x + b.x
result.y := a.y + b.y
return result
end
var p : Point
p.x := 3
p.y := 4
p := AddPoints(p, p)
print p.x
print p.y