Задача:
Вы должны создать интерпретатор, который может анализировать фрагменты языка программирования. Язык не должен быть сложным, но он должен включать следующие синтаксические элементы:
- Возможность назначать и читать переменные (может быть так же просто, как
a
-z
быть предварительно созданными переменными) - Если заявления (elseif и else не требуются)
- Циклы (считая произвольного числа, доступ пользователя к счетчику не требуется)
- Простая математика с переменными (сложение, вычитание, умножение, деление, больше / меньше, равно)
- Распечатать заявления
Правила:
- Вы не можете копировать синтаксис другого популярного языка.
- Вам нужно написать свой собственный переводчик, а не модификацию другого переводчика.
- Вы можете написать свой переводчик на любом языке.
- Напишите пример программы на 99 бутылок пива на вашем языке (см. Здесь )
- Это конкурс популярности , поэтому победит ответ, получивший наибольшее количество голосов.
Ответы:
DogeScript
Программа 99 бутылок пива:
Интерпретатор PHP:
Синтаксис в его нынешнем виде:
Попробуй это здесь .
Любые предложения по улучшению приветствуются.
источник
BrainBack: основанный на стеке скомпилированный язык, работающий на BrainFuck
NB: спецификация была изменена с "создания анализатора" на "создание интерпретатора" после того, как я опубликовал этот ответ. Этот ответ является компилятором, который также анализирует исходный код.
Название - каламбур на Back, являющийся противоположностью хорошо известного стекового языка и Brain. указывает на его эзотерическую природу. Это немного похоже на BrainFuck (хотя и не так), но его компилятор работает на BrainFuck и его скомпилированный объектный код заканчивается как двоичные файлы BrainFuck.
Язык: * == уничтожает свои аргументы
"constant"
печатает константу#
печатает вершину стека как число>
дублирует вершину стека<num>
нажмите постоянное число<num>
в качестве значения в начало стека<
удалить вершину стека-
вычитаем верхний из второго верхнего *+
добавить верхний ко второму верхнему *!
не переключает положительный / ноль *[ ... ]
делает некоторое время вершина стека не ноль, очень похоже на BrainFuck99 бутылок пива с правильной лирикой в BrainBack:
Компилятор BrainBack, написанный на расширенном BrainFuck
Чтобы скомпилировать BrainBack:
Чтобы скомпилировать программу BrainBack:
Запустите бинарный файл:
Здесь я использую bf, доступный в большинстве дистрибутивов Debian.
beef
и другие также могут быть использованы. И EBF-компилятор, и BrainBack, и его объектный код становятся вполне совместимыми двоичными файлами BrainFuck.Вероятно, его следует расширить, чтобы печатать ячейку как ascii
.
, иметь возможность считывать байты,
и выполнять различныеswap
операции, чтобы быть более полезными. Это абсолютно необходимо для того, чтобы сделать компилятор или интерпретатор BrainBack в BrainBack.источник
€
Я трачу большую часть своего времени на PHP-скрипты, и это вызывает у меня вопрос: почему я вынужден использовать
$
для имен своих переменных?€
моя местная валюта, так что давайте использовать ее! Поскольку € используется во многих странах, я использовал несколько слов из языков ЕС в качестве ключевых слов.Ключевые слова:
gleich
является равным на немецком языкеmientras
это время по-испанскиtopo
это больше на португальском (обновление: оно должно быть Maior вместо этого, благодаря daHugLenny на кончике)odejmowanie
это вычитать на польском языкеafficher
это печать на французскомnl
иногда называются , а TLDNETHERLANDS
-nl
, поэтому я определил константуNETHERLANDS
для отображения строк переводаЯ немного обманул, так как нет
if
ключевого слова, я решил напечатать последние две строки.Переводчик в Python
Переводчик не сделает ничего, кроме выполнения сценария, чтобы отобразить 99 бутылок пива.
Чтобы запустить его, сохраните оба файла, затем запустите файл Python со
.eu
сценарием в качестве аргумента:источник
topo
это топ - португальски1Lang
1Lang - это функциональный префиксный язык, такой как LISP или Scheme, но без скобок, который затрудняет чтение при удалении всего ненужного пробела. Скобки могут быть удалены, поскольку все функции и операторы принимают известное количество параметров.
Скобки необходимы для разграничения тела функции и условного следствия, а также блоков альтернативного кода, которые могут состоять из списка операторов.
В LISP Факториал может быть определен так:
в 1Lang это будет
который может быть уменьшен до
1Lang в настоящее время не поддерживает никаких побочных эффектов.
1Lang написан на bash, поэтому в настоящее время он разделяет некоторые ограничения bash, такие как целочисленный диапазон.
NB. Списки не полностью реализованы.
Целые числа - целые числа bash (я думаю, что они могут быть от -2 ^ 32 до 2 ^ 31-1). Отрицательные числа не могут быть использованы напрямую. Чтобы ввести негатив, вычтите его из нуля. например. -5 будет введено как -0 5. Это ограничение связано с тем, что 1Lang находится в стадии разработки и отрицательные числа не нужны для этого приложения. Я рассматриваю использование ~ в качестве унарного отрицательного оператора, который позволил бы ввести -5 как ~ 5.
Пробел необходим для разграничения целых чисел. например. +2 3
Имена параметров функций могут перегружать переменные вызывающих. Все переменные, назначенные в функции, являются локальными.
Печать не требуется (хотя это может быть полезно), поскольку, как и в LISP, каждый оператор возвращает значение, а последнее возвращаемое значение печатается.
Неожиданное поведение префиксной нотации без скобок заключается в том, что конкатенация строк действительно может быть легко написана. Скажем, вы хотите объединить
"a" " quick" " brown" " fox"
, можно написать:Но более читаемый и менее подверженный ошибкам метод заключается в следующем:
или
99 бутылок пива код:
Функция B возвращает «Больше бутылок» или «1 бутылка» или «бутылки» в зависимости от x.
Функция F возвращает нормальные стихи или последний стих. Обычный стих соединяется со следующим стихом путем рекурсивного вызова F с -x1. Когда х равен 0, F возвращает последний стих.
Это генерирует (для F5 означает начать с 5 бутылок пива ...):
1Lang интерпретатор (написан на bash) длиной до 500 строк.
источник
@Mfxy{fxy}M+3 4
работал, но тогда вам нужно объединить пространство имен функции и переменной. Потребовалось некоторое время, чтобы вычислить 99 сортов пива: pcons
вас есть, вы можетеmap
M\x{*x2}C1C2C3C4/ => (2 4 6 8)
Половина (переводчик в Windows Batch)
Я не знаю, почему я отвечаю на так много загадок в пакетном режиме Windows, по какой-то больной причине, я думаю, что мне это нравится: P В любом случае, это похоже на то, над чем я работал ради забавы некоторое время назад, базовый язык, который переводится в пакет Windows с помощью сценария, который также записывается в пакетном режиме Windows. Это не особенно удивительно, но это работает.
99 бутылок пива
Синтаксис
В каждой строке распознаются только три токена, разделенных пробелами.
# это комментарий.
В большинстве случаев, когда требуется значение, a
$
во втором токене означает, что третий должен рассматриваться как имя переменной, тогда как a~
обозначает буквальное значение. Общие инструкции принимают форму<instruction> [$~] <name>
. Установка переменной принимает ту же форму, но реализуется всякий раз, когда не распознается.Определенные команды:
print
иwrite
оба пишут вывод, ноwrite
не добавляют символ новой строки. Нуждается в $ или ~.mark
создает точку, к которой можно перейти или вызвать как подпрограмму.jump
эквивалент Goto в пакетном режиме (или любой язык в этом отношении).proc
вызывает подпрограмму. Эквивалентcall :label
.return
возвращает из подпрограммы. Выход из программы, когда не внутри.if
условная инструкция. Берет сравнение из следующей строки, в форме<var1> <operator> <var2>
. Операторы те же, чтоif
и в пакетном режиме, т.е.EQU, NEQ, LSS, LEQ, GTR, GEQ
, После этого выполнит инструкции, только если сравнение истинно.endif
заканчивает оператор ifcat
объединяет две переменные.cat a b
будет хранить значение ab в.Когда ни одна из этих команд не найдена, выражение обрабатывается как присвоение переменной с использованием первого токена в качестве имени переменной.
$
и~
ведут себя так же, как вprint
, но есть также@
идентификатор. Это обрабатывает последний токен как математическое выражение, переданное вset /a
. Включает в себя большинство операторов. Если ни один из трех идентификаторов не найден, это синтаксическая ошибка, и интерпретатор завершает работу.Интерпретатор (Windows Batch)
Интерпретатор фактически переводит код в пакет Windows, помещает его во временный файл и выполняет его. Хотя он распознает синтаксические ошибки в языке Half, в результате пакетный скрипт может вызвать проблемы, особенно со специальными символами, такими как круглые скобки, вертикальные черты и т. Д.
источник
Flex Bison
Присвойте переменную, если еще блок условия и некоторые другие операции сложения, вычитания.
Лаксический файл
lex.l
Файл парсера
com.y
Compile
Бегать
компилятор in.txt ou.txt
Входной файл
а = 3 + (4 * 7) -9; распечатать а; с = а + 45; печать с;
** Это комментарий сохранить c;
** сохранить c в файле print c * (a + 32);
Выходной файл 67
источник
переводчик
Для получения инструкций о том, как запустить этот код, посмотрите на мой другой ответ: /codegolf//a/19935/13186
99 бутылок пива
Программа
источник
99ISC
99ISC использует целочисленную память произвольного размера. Память индексируется неотрицательным целым числом. Все значения в памяти инициализируются с их адресом. Например. Во время выполнения адрес 0 содержит значение 0, а адрес 9 содержит значение 9.
99ISC имеет две инструкции. Первый распечатывает процедуру «99 бутылок пива на стене». Его синтаксис представляет собой одну строку, как показано ниже. Выполнение продолжается со следующей строки в программе.
Вторая инструкция - это инструкция «вычитать и переходить, если не равна нулю». Его синтаксис представляет собой одну строку, как показано ниже.
x
является адресом числа, с которым нужно работать,y
является адресом вычитаемого числа иz
является следующей строкой, которую нужно выполнить, если результат вычитания не равен нулю. В противном случае выполнение продолжается со следующей строки.Наличие команды «вычитать-и-ветвь-если-не-ноль» делает 99ISC OISC (один компьютер с набором инструкций), и, следовательно, выполнение Тьюринга завершено.
Вот программа, которая стирает первые 10 значений в памяти, а затем печатает процедуру «99 бутылок пива на стене».
А вот и интерпретатор 99ISC на языке Python.
источник
Я даю тебе:
Небольшой переводчик инструкций (SISI)
Синтаксис опирается на бейсик и сборку. Она имеет четыре заявления:
set
,print
,jump
(безусловная GOTO) иjumpif
(условное Гото). Каждому утверждению должен предшествовать номер строки. Поддерживаемые типы данных - целые числа и строки.Сам переводчик можно найти в Python 3 на Github (sisi.py). Программа «99 бутылок пива» также есть, но я воспроизведу ее здесь:
источник
полярный геофизический спутник
https://github.com/nrubin29/Pogo
источник
i
и устанавливаю его равным 99. Затем, пока я больше 0, я печатаюi bottles of beer on the wall
и вычитаю одно изi
. Если проблема в том, что мне не хватает некоторых текстов, я могу добавить больше.