Программы
Авиасимулятор
Видеокодек
Шаблонизатор
Архиватор
Компилятор
Видеомонтажка



Если обнаружите в тексте страницы ошибку, выделите ее мышкой и нажмите 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;
}
}


© Dee Mon, 2004-2010.