1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/leonchen83-cool-lang

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

cool-lang

Интерпретатор Classroom Object Oriented Language (Stanford cs143), написанный на Java8

Требования

    $java -version
    $java version "1.8.0_20"

    $mvn -version
    $Apache Maven 3.2.3

Использование

    $cd cool-lang/
    $mvn clean package
    $cd target
    $java -jar cool-lang-1.0-SNAPSHOT-jar-with-dependencies.jar ../src/test/resources/hello.cl

вывод:

    Hello, world! chen bao yi

Примеры синтаксиса

  • sort_list.cl
Класс List наследует IO {
        (* Так как abort() возвращает Object, нам нужно что-то типа Bool в конце блока, чтобы удовлетворить типовую проверку.
           Этот код недоступен, так как abort() останавливает программу. *)
	isNil() : Bool { { abort(); true; } };

	cons(hd : Int) : Cons {
	  (пусть new_cell : Cons <- new Cons в
		new_cell.init(hd, self)
	  )
	};

	(*
	   Так как abort "возвращает" тип Object, нам нужно добавить
	   выражение типа Int здесь, чтобы удовлетворить типовую проверку.
	   Этот код недоступен.
        *)
	car() : Int { { abort(); new Int; } };

	cdr() : List { { abort(); new List; } };

	rev() : List { cdr() };

	sort() : List { cdr() };

	insert(i : Int) : List { cdr() };

	rcons(i : Int) : List { cdr() };

	print_list() : Object { abort() };
};

Класс Cons наследует List {
	xcar : Int;  -- Мы сохраняем car в cdr в атрибутах.
	xcdr : List; -- Поскольку abort "возвращает" тип Object, нам нужно добавить
		     -- выражение типа Int здесь, чтобы удовлетворить типовую проверку.
		     -- Этот код недоступен.
	isNil() : Bool { false };

	init(hd : Int, tl : List) : Cons {
	  {
	    xcar <- hd;
	    xcdr <- tl;
	    self;
	  }
	};

	car() : Int { xcar };

	cdr() : List { xcdr };

	rev() : List { (xcdr.rev()).rcons(xcar) };

	sort() : List { (xcdr.sort()).insert(xcar) };
``````markdown
## Примеры кода

### Пример 1: Сортировка чисел

```cl
Класс List наследует IO {

	print_list() : Object { true };

};


Класс Main наследует IO {

	l : List;

	(* iota maps its integer argument n into the list 0..n-1 *)
	iota(i : Int) : List {
	    {
		l <- new Nil;
		(пусть j : Int <- 0 в
		   пока j < i
		   loop
		     {
		       l <- (new Cons).init(j,l);
		       j <- j + 1;
		     }
		   pool
		);
		l;
	    }
	};

	main() : Object {
	   {
	     out_string("Введите количество чисел для сортировки?");
	     iota(in_int()).rev().sort().print_list();
	   }
	};
};

Пример 2: Факториал

Класс Main наследует IO {
    main(): Object {{
        out_string("Введите целое число, большее или равное 0: ");
        пусть input: Int <- in_int() в
            если input < 0 то
                out_string("ОШИБКА: Число должно быть больше или равно 0\n")
            иначе {
                out_string("Факториал ").out_int(input);
                out_string(" равен ").out_int(new Main1.factorial(input));
                out_string("\n");
            }
            fi;
    }};
    factorial(num: Int): Int {
        если num = 0 то 1 иначе num * factorial(num - 1) fi
    };
};
Класс Main1 наследует IO {
    factorial(num: Int): Int {
        если num = 0 то 1 иначе num * factorial(num - 1) fi
    };
};

Пример 3: Палиндром

Класс Main наследует IO {
    pal(s : String) : Bool {
	если s.length() = 0
	то true
	иначе если s.length() = 1
	то true
	иначе если s.substr(0, 1) = s.substr(s.length() - 1, 1)
	то pal(s.substr(1, s.length() -2))
	иначе false
	fi fi fi
    };
};

Класс Nil наследует List { isNil() : Bool { true };

    rev() : List { self };

sort() : List { self };

insert(i : Int) : List { rcons(i) };

rcons(i : Int) : List { (new Cons).init(i,self) };

};``` i : Int;

main() : SELF_TYPE {
{
        i <- -1;
    out_string("введите строку\n");
    if pal(in_string())
    then out_string("это палиндром\n")
    else out_string("это не палиндром\n")
    fi;
}
};

};


## Ссылки

  * [Руководство по COOL](https://spark-university.s3.amazonaws.com/stanford-compilers/resources%2Fcool_manual.pdf)
  * [Видео-лекции](https://class.coursera.org/compilers-004/lecture)
  * [Алгоритм шunting yard](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)
  * [Java Tokenizer, Parser](http://hg.openjdk.java.net/jdk8/jdk8/langtools/)

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Интерпретатор объектно-ориентированного языка Classroom, написанный на Java 8. Развернуть Свернуть
Unix Assembly и 4 других языков
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/leonchen83-cool-lang.git
git@api.gitlife.ru:oschina-mirror/leonchen83-cool-lang.git
oschina-mirror
leonchen83-cool-lang
leonchen83-cool-lang
master