Слияние кода завершено, страница обновится автоматически
Интерпретатор 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
Класс 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();
}
};
};
Класс 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
};
};
Класс 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 )