WeekendInterpreter
Интерпретатор языка прораммирования
Беру текстовый редактор и делю его центральную часть на две: в верхней части оставляю редактор, а в нижней размещаю панель, в которой будет отображаться всё, что будет выводить мой интерпретатор. Затем добавляю меню “Выполнить” с пунктами “Выполнить” и “Остановить”. Реализую интерпретатор выполняющий программу открытую в редакторе.
Запустить приложение можно: из Eclipse, двойным кликом по WeekendInterpreter.jar или, если он не запускается, то двойным кликом по WeekendInterpreter.bat. Если и последнее не запускает приложение, то скачайте и установите Java 11 или новее и снова попробуйте способы, описанные выше.
Описание языка
Для описания синтаксиса языка удобно использовать Форму Бэкуса-Наура (BNF). Однако наиболее популярные учебники по различным языкам программирования её не используют. Что ж, пожалуй, и я без неё обойдусь.
Язык называется Weekend Game Language. Расширение файлов по умолчанию WGL
Комментарий
REM Пример программы
Переменная
Переменная в языке обозначается буквой латинского алфавита. Таким образом, можно использовать 26 переменных. Переменные имеют целый тип.
Не очень впечатляет? Но надо понимать, что это только проба разработки интерпретатора, знание того, как это вообще делается, заготовка для будущей адаптации под конкретные нужды, Hello world в написании интерпретаторов.
Строка это любая последовательность символов, заключённая в двойные кавычки.
Присваивание, выражение
a = 7
b = 8 * (a + 5)
Поддерживаются операции: унарный минус, +, -, *, /, % (остаток по модулю), ^ (возведение в степень). Приоритет операций традиционный, но можно изменять круглыми скобками.
Вывод (в область вывода)
PRINT "a = ", a
Вывод с переводом строки
PRINTLN
PRINTLN "b = ", b
PRINTLN "b - 37 = ", b – 37
Т.е. после PRINT или PRINTLN перечисляются через запятую строки, переменные или выражения.
Ввод
INPUT "Укажите значение X: ", x
На экране появится окно ввода значения, и надо будет ввести значение. Можно не вводить, но это будет интерпретироваться как ввод 0. Конечно хорошо бы вводить значение непосредственно в области вывода интерпретатора. Но это несколько усложняет код, а в данном случае важно, чтобы реализация была максимально простой и легко читалась.
Безусловный переход (да простит меня Эдсгер Вибе Дейкстра)
GOTO 10
Число 10 — это метка строки программы. Чтобы поставить в строке метку и таким образом указать, куда следует переходить, напишите это число в самом начале строки. Например:
10 PRINTLN "Метка 10"
Кстати, в операторе GOTO в качестве метки не обязательно использовать константу. Это может быть переменная или произвольное выражение.
Условный переход или выполнение одной команды по условию
IF a > 5 THEN GOTO 20
Не обязательно писать GOTO, можно написать любой оператор, но только один.
Поддерживаются операции сравнения: <, >, =, #.
Цикл
FOR i = 3 TO 7
операторы
NEXT
Подпрограмма
1000
PRINTLN "Это подпрограмма 1000"
RETURN
У подпрограмм нет имён. Они идентифицируются метками. Располагать их следует после основной программы. Заканчиваеся подпрограмма командой RETURN.
Вызов подпрограммы
GOSUB 1000
Завершение программы
END
В конце программы можно вообще ничего не писать, но после текста основной программы могут следовать подпрограммы, и тогда надо использовать END, чтобы их разделить.
Пример программы
Применение всех вышеописанных конструкций можно посмотреть, запустив программу CommandsDemo.wgl (включена в репозиторий).
Итоги
Сделана реализация вот такого языка, похожего то ли на Fortran, то ли на доисторический Basic, на которых писали наши папы, бабушки и некоторые из нас. Как проба написания интерпретаторов - это интересно. Может пригодиться как заготовка для адаптации под конкретные нужды. Как, собственно язык программирования… ну, вы поняли. А мне так было интересно погрузиться на время в далёкое прошлое. Будто бы не программу писал, а принимал участие в испытании машины времени.
О реализации
В качестве шаблона приложения я взял WeekendTextEditor, причем целиком пакет game.weekend.texteditor, в котором я не стал даже менять название главного класса. Ему так и оставлено название WeekendTextEditor. Собственно интерпретатор выделен в пакет game.weekend.interpreter. В новом пункте меню “Выполнить” делается сохранение текущего редактируемого файла и вызывается метод Runner.run(), который открывает только что сохраненный файл и начинает его интерпретировать.
Ну а более подробное описание интерпретации смотрите тут: Интерпретатор
Хорошо бы…
Сделать нумерацию строк в редакторе и выделение цветом ключевых слов.
Описание
Интерпретатор выходного дня