Я заинтересован в расширении своих знаний в области компьютерного программирования путем реализации языка программирования на основе стека. Я ищу совета о том, с чего начать, поскольку я предполагаю, что у него будут функции вроде «pushint 1
», которые будут выталкивать целое число со значением 1 на вершину стека и управлять потоком с помощью меток типа «L01: jump L01:
».
До сих пор я сделал реализацию C # того, что я хочу, чтобы мой язык работал (хотел связать с ним, но IDEOne заблокирован), но это очень беспорядочно и требует оптимизации. Он переводит ввод в XML, а затем анализирует его. Мои цели - перейти на язык более низкого уровня (возможно, C / C ++), но мои проблемы связаны с реализацией стека, который может содержать различные типы данных и не имеет фиксированного размера.
В конце концов, я также хотел бы реализовать массивы и функции. Вдобавок я думаю, что мне нужен лучший лексер, и мне интересно, будет ли дерево синтаксического анализа хорошей идеей для такого упрощенного языка.
Любые советы / критика приветствуются, и, пожалуйста, учтите, что я все еще достаточно новичок в программировании (я только недавно закончил AP CompSci I). Также приветствуются ссылки на стековые языки с открытым исходным кодом.
Вот базовая программа, которую я хотел бы попробовать интерпретировать / скомпилировать (где [this is a comment]
):
[Hello World!]
pushchar '\n'
pushstring "Hello World!"
print
[Count to 5 and then count down!]
pushint 1
setlocal 0
L01:
pushchar '\n'
getlocal 0
print [print x + '\n']
getlocal 0
increment
setlocal 0 [x = x + 1]
pushint 5
getlocal 0
lessthan [x < 5]
iftrue L01
L02:
pushchar '\n'
getlocal 0
print [print x + '\n']
getlocal 0
decrement
setlocal 0 [x = x - 1]
pushint 0
getlocal 0
greaterthan [x > 0]
iftrue L02
Ожидаемый результат:
Hello World!
1
2
3
4
5
4
3
2
1