|
Если обнаружите в тексте страницы ошибку, выделите ее мышкой и нажмите Ctrl-Enter.
|
|
Компилятор
Экспериментальный компилятор,
написанный давным-давно при прохождении в университете курса построения
компиляторов. Переводит программу на языке ZUSUL (Ze Ugly Stupid Useless Language :) )
в текст на языке ассемблера виртуальной машины CVM. Язык придумал сам.
Основные фичи:
- Язык позволяет создавать и использовать собственные классы, содержащие переменные других классов и функции-методы.
- Язык позволяет определять собственные двухместные операции над любыми классами.
- Практически все конструкции языка (такие как if, while, составной оператор...) имеют возвращаемое значение и могут быть использованы в выражениях.
Практической ценности не представляет, но имеет ценность в
качестве примера для создания своих компиляторов студентами ВМК МГУ (уже
неоднократно обращались, вот и решил выложить).
Написан на С++ с использованием инструмента
ANTLR 2.7.1.
Грамматика приводится в формате этого инструмента.
Сам транслятор собран на MS Visual C++ 6.0 с подключением статической
библиотеки ANTLR.
Внимание: ANTLR заточен под грамматики типа LLk. LR-грамматики он не берет!
Скачать архив, включающий сам компилятор, виртуальную машину, документацию к
обоим и исходники компилятора.
Пример работающей программы, вычисляющей число Пи (первые 3 знака) методом Монте-Карло:
class memory {
func pointer init()
{
var pointer p;
p=&p;
p=<49152;
p=<16384;
}
func pointer malloc(int size)
{ var pointer p;
var int i, pnt;
p=&p;
p=<49152;
i=<p;
pnt=i;
pnt = pnt + size;
p=<pnt;
i;
}
}
class Program {
var int seed;
var memory mem;
oper io << (io left, int a)
{
var pointer p;
var int x, t, d;
var char c;
var memory mem;
p = mem.malloc(16);
t=100000; x=0;
while(t) {
d = a/t;
c = d;
(p +x) =< c+'0';
a=a - (d*t);
t=t/10;
x=x+1;
};
c=10;
(p+x) =<c;
left << p;
}
func int rand() {
var int t;
t = seed = 13 + 667*seed;
if (t<0) t=0-t;
if (t<1000) t=t+1000;
t - 1000*t/1000;
}
func int main() {
var int i,x,y, n;
var float f;
var io cout;
var pointer s;
mem.init;
seed=1;
i=0; n=0;
while(i<10000) {
x=rand; y=rand;
if (((x*x)+(y*y))<1000000) n=n+1;
i=i+1;
};
n=n*4;
cout << n;
}
}
|