Bu proje, stack tabanlı mini bir programlama dili için bir derleyici ve yorumlayıcı pipeline'ı sunar.
Kaynak kod, sırasıyla parsing, AST oluşturma, semantik analiz, kod üretimi ve yürütme aşamalarından geçirilir.
| Özellik | Açıklama |
|---|---|
| Lexer & Parser | PLY kullanılarak token'lar ayrılır ve AST (Abstract Syntax Tree) oluşturulur. |
| AST Görselleştirme | AST hiyerarşik olarak görselleştirilir; düğümlerin türleri, değerleri ve operatörleri gösterilir. |
| Semantik Analiz | Değişkenler ve fonksiyonlar kontrol edilir, tip uyumsuzlukları ve hatalı kontrol akışları tespit edilir. |
| Stack Machine | AST'den üretilen bytecode, stack tabanlı sanal makinede çalıştırılır. |
| Kod Üretimi | Bytecode üretimi ve yürütme desteği sağlanır. |
- Değişken atamaları ve ifadeler
- Karar yapıları:
if-else - Döngüler:
while,for - Fonksiyon tanımları ve çağrıları
- Mantıksal ve aritmetik operatörler:
+,-,*,/,%,&&,||,==,!=,<,>,<=,>= breakvecontinuekontrol ifadelerireturnifadeleri
stack_compiler/ # Proje kök dizini
│
├─ compiler/ # Paket klasörü
│ ├─ __init__.py
│ ├─ lexer.py
│ ├─ parser.py
│ ├─ ast_nodes.py
│ ├─ ast_printer.py
│ ├─ semantic_analyzer.py
│ ├─ stack_interpreter.py
│ └─ stack_codegen.py
│
├─ tests/ # Test dosyaları
│ ├─ test1.txt
│ ├─ test2.txt
│ └─ ...
│
├─ examples/ # Örnek kaynak kodlar
│
├─ main.py # Pipeline'ı çalıştıran script
└─ README.md
Python 3.8 veya üzeri sürüm gereklidir.
pip install plypython main.pyKaynak kod, token'lara ayrılır. Yorumlar ve boşluklar göz ardı edilir. Satır numarası takibi yapılır.
from lexer import Lexer
lexer = Lexer()
lexer.input('x = 10 + 5;')
while True:
tok = lexer.token()
if not tok:
break
print(f"{tok.type} -> {tok.value} (line {tok.lineno})")Çıktı Örneği:
IDENTIFIER -> x (line 1)
EQUALS -> = (line 1)
NUMBER -> 10 (line 1)
PLUS -> + (line 1)
NUMBER -> 5 (line 1)
SEMI -> ; (line 1)
Token'lar kullanılarak AST oluşturulur. Tüm ifadeler ve blok yapıları AST düğümleriyle temsil edilir.
from parser import Parser
parser = Parser()
ast = parser.parse('x = 10 + 5;')
print(ast)AST, hiyerarşik şekilde görselleştirilir. Düğüm türü, değer ve operatörler ekrana yazdırılır.
from ast_printer import AstPrinter
printer = AstPrinter()
printer.print_ast(ast)Örnek Görselleştirme:
<Program>
| Stmt: <Assignment>
| | Target: <Identifier>
| | | Name: x
| | Expr: <BinOp>
| | | Left: <Literal>
| | | | Value: 10
| | | Right: <Literal>
| | | | Value: 5
| | | Op: +
Değişken ve fonksiyon türleri kontrol edilir. Döngü dışı break/continue ve return ifadeleri tespit edilir.
from semantic_analyzer import SemanticAnalyzer, SemanticError
analyzer = SemanticAnalyzer()
try:
analyzer.analyze(ast)
print("Program semantik olarak doğru.")
except SemanticError as e:
print("Semantik hata:", e)AST'den üretilen bytecode, stack tabanlı sanal makinede çalıştırılır.
from stack_interpreter import StackMachine
bytecode = ["PUSH 10", "PUSH 5", "ADD", "STORE x"]
vm = StackMachine(bytecode)
vars_out = vm.run()
print(vars_out)Çıktı:
{'x': 15}AST'den bytecode üretilir ve stack tabanlı sanal makinede yürütülür.
from stack_codegen import CodeGenerator
gen = CodeGenerator()
bytecode = gen.generate(ast)
print(bytecode)Kod örnekleri, AST oluşturma, semantik analiz ve bytecode yürütme aşamalarından geçirilir.
from parser import Parser
from ast_printer import AstPrinter
from semantic_analyzer import SemanticAnalyzer
from stack_interpreter import StackMachine
parser = Parser()
code = "x = 10 + 5;"
# Parsing
ast_root = parser.parse(code)
# AST Görselleştirme
printer = AstPrinter()
printer.print_ast(ast_root)
# Semantik Analiz
analyzer = SemanticAnalyzer()
analyzer.analyze(ast_root)
# Bytecode üretimi ve yürütme (opsiyonel)
try:
from stack_codegen import CodeGenerator
gen = CodeGenerator()
bytecode = gen.generate(ast_root)
print("Bytecode:", bytecode)
vm = StackMachine(bytecode)
vars_out = vm.run()
print("Değişkenler:", vars_out)
except ImportError:
print("Kod üretimi modülü bulunamadı. Atlandı.")- Söz dizimi hataları parsing sırasında raporlanır.
- Tanımsız değişken veya tip uyumsuzluğu semantik analizde tespit edilir.
Test dosyaları test1.txt, test2.txt, test3.txt, test4.txt şeklinde isimlendirilmiştir ve pipeline üzerinden çalıştırılabilir.
python main.py