Skip to content
/ mines3c Public

Компилятор чего-то типа высокоуровневого в код программатора игры ШАХТЫ (Mines 3)

Notifications You must be signed in to change notification settings

Dliwk/mines3c

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

mines3c

Компилятор чего-то типа высокоуровнего в код программатора игры ШАХТЫ.

Синтаксис

Определения

Программа состоит из "определений". Каждое определение --- это либо константа (const), либо функция (fn).

Константа

Пример определения константы:

const BLUE_CRYSTAL = 109;

Функция

Функции бывают двух видов: встраиваемые (inline) и обычные. Встраиваемые функции вставляются просто вставляются в вызывающий код, тем временем как вызов обычных функций использует команды GOSUB / GOFUNC / GOSTATE и RETURN / RETURN1 / RETURNSTATE.

Пример определения встраиваемой функции:

inline fn move_down_twice() {
  move_down();
  move_down();
}

Определение обычных функций позвляет указывать тип вызова: без передачи аргументов (см. GOSUB) - (), передача аргумента (см. GOFUNC) - (arg), передача состояния (см. GOSTATE) - (state).

Примеры:

// Ничего не принимает
fn cycle() {
  loop {
    turn_left();
  }
}

// Принимает аргумент и возвращает аргумент
fn is_wb(arg) -> arg {
  return $CEL == 81;
}

// Ничего не принимает и возвращает состояние
fn select_forward_left() -> state {
  select_forward();
  selection_move_left_hand();
  return;
}

Аналогично с возвращаемым значением, это может быть ничего (см. RETURN), аргумент (см. RETURN1) и состояние (см. RETURNSTATE).

Утверждения

Тело каждой функции, в свою очередь, может состоять из следующего:

Безусловный цикл (loop)

Пример ниже показывает, как сделать вечно крутящегося бота.

loop {
  turn_left();
}

Условный цикл (while)

Выполняет действия только если условие верно. Пример:

while $Y < 1000 {
  move_down();
}

Условный оператор (if - else)

Если условие верно --- выполняет ветку if, иначе else. Примеры:

// Только одна ветка, если условие неверно --- не делать ничего.
if low_hp() {
  quit();
}


// Если условие верно -- первая ветка, иначе -- вторая.
if $DIR == 0 {
  turn_left();
} else {
  turn_right()
}

// Можно составлять цепочку из условий, тогда будет выполнено только какое-то
// одно из них:
if $LOA > 90 {
  do_something();
} else if $LOA > 50 {
  do_something_different();
} else {
  go_mine();
}

Вызов функции

Все просто: имя, скобки, точка с запятой.

move_up();

Возвращение из функции (return)

Можно вернуть выражение, подобное тому, что можно передать как условие для if или while. Примеры:

// Просто вернуться. В зависимости от типа возвращаемого значения, указанного в
// определении функции, будет использована соответствующая команда.
return;

// Вернуть булевое значение (потом эту функцию можно будет использовать как
// условие). Для этого тип возвращаемого значения должен быть `arg` или `state`.
return $CEL == 50;

Прямая вставка команды программатора (__code__)

Пример:

// Выбрать клетку впереди нас.
__code__("[F]");

Выражения

Условием для операторов if и while (а также тем, что может возвращать return) могут быть следующие вещи:

Сравнение значения переменной с числом.

Число может быть заранее объявленной константой, или же явным значением. Примеры:

if $CEL == 51 { ... }

return $HPP < 70;

Результат другой функции

Функция должна быть inline либо возвращать arg или state. Пример:

if low_hp() { ... }

Выполнение

main

Каждая программа должна определять функцию main. Исполнение программы начнется с этой функции.

Стандартная библиотека

По умолчанию компилятор компилирует исходный код вместе со стандартной библиотекой (исходный код которой на данный момент лежит тут). Если вы не хотите этого --- воспользуйтесь флагом --nostdlib.

About

Компилятор чего-то типа высокоуровневого в код программатора игры ШАХТЫ (Mines 3)

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages