Lavr wrote:...я решил в этот раз совместить приятное с полезным и допилить в этот вариант корректную
работу с длинной строкой аргумента, содержащей скобки и математические операции.
Lavr wrote:Просто не всегда это легко вделать в существующий уже исходник - иногда проще переписать заново.
Я вот сейчас с трудом пытаюсь это сделать. Ассемблер был написан отдельно, про обработку строки
я задумался в самом конце.
Отдельно попробовал алгоритм со стеками - он работает, но в исходник вписывается тяжело.
В общем, зело подумав, я предпринял следующий трюк. Поскольку очень не хотелось сильно переделывать
уже хорошо работающий исходник, я для строки, где есть математические операции, стал заносить в массив
меток на 1-м проходе "нелегальную" метку
M#A#T#H.
На втором проходе, когда все адреса меток и константы уже известны, такая метка вызывает ошибку,
в этот момент я и вызываю функцию анализа математических операции в строке аргумента -
ValTOKEN.
Если эта функция выдает результат, то строка успешно компилируется в код операции.
Если же функция
ValTOKEN возвращается с ошибкой, то в листинг компиляции записывается:
"*** Error: Invalid Expression. ***************;".
Математику по предварительным тестам вычисляет правильно.

- 4math.gif (12.56 KiB) Viewed 9664 times
|
С точки зрения элегантности всё выглядит несколько тяжеловато, но работает вполне нормально!
Обратил также внимание, что если бы я предусмотрел такую функцию с самого начала написания
этого транслятора с языка 4-битного ассемблера, код получился бы компактнее и проще.
Поскольку на первом проходе уже можно было бы вычислить часть выражений, для которых известны
все входящие операнды. В этом же случае подпрограммы как бы дублируются частично.
Ну и вот этот вопрос меня сейчас немного озадачил:
Lavr wrote:Для 4-bit CPU в этом особой необходимости нет, но хочу сделать хороший программный шаблон
для компилятора ассемблера, ...
Действительно, для процессора с гарвардской архитектурой некоторые трюки типа
$+2,
STA M+1
не столь актуальны, как для архитектуры фон Неймана, поскольку память программ и данных разделены.
То есть, красивым трюком
STA M+1 программу как в
i8080 не подправишь, а с памятью данных такой
финт не выглядит эффективным - этой памяти всего 16 нибблов...
Поэтому на данный момент анализ мат.операции я вставил лишь для кодов с адресом, где результат
может достигать 4096. В остальных случаях аргумент не более 15, и есть ли необходимость что-либо
вычислять - я пока сомневаюсть. Глубину стеков, кстати, уменьшил до 20.
Поработаю пока с этим ассемблером и аппаратной частью
4-bit Processor-а, для которого он и был написан.
Результаты выложу по готовности. Всё равно сам по себе этот ассемблер никому отдельно не нужен...