Lavr wrote:...я решил в этот раз совместить приятное с полезным и допилить в этот вариант корректную
работу с длинной строкой аргумента, содержащей скобки и математические операции.
Lavr wrote:Просто не всегда это легко вделать в существующий уже исходник - иногда проще переписать заново.
Я вот сейчас с трудом пытаюсь это сделать. Ассемблер был написан отдельно, про обработку строки
я задумался в самом конце.
Отдельно попробовал алгоритм со стеками - он работает, но в исходник вписывается тяжело.
В общем, зело подумав, я предпринял следующий трюк. Поскольку очень не хотелось сильно переделывать
уже хорошо работающий исходник, я для строки, где есть математические операции, стал заносить в массив
меток на 1-м проходе "нелегальную" метку
M#A#T#H.
На втором проходе, когда все адреса меток и константы уже известны, такая метка вызывает ошибку,
в этот момент я и вызываю функцию анализа математических операции в строке аргумента -
ValTOKEN.
Если эта функция выдает результат, то строка успешно компилируется в код операции.
Если же функция
ValTOKEN возвращается с ошибкой, то в листинг компиляции записывается:
"*** Error: Invalid Expression. ***************;".
Математику по предварительным тестам вычисляет правильно.
4math.gif
С точки зрения элегантности всё выглядит несколько тяжеловато, но работает вполне нормально!
Обратил также внимание, что если бы я предусмотрел такую функцию с самого начала написания
этого транслятора с языка 4-битного ассемблера, код получился бы компактнее и проще.
Поскольку на первом проходе уже можно было бы вычислить часть выражений, для которых известны
все входящие операнды. В этом же случае подпрограммы как бы дублируются частично.
Ну и вот этот вопрос меня сейчас немного озадачил:
Lavr wrote:Для 4-bit CPU в этом особой необходимости нет, но хочу сделать хороший программный шаблон
для компилятора ассемблера, ...
Действительно, для процессора с гарвардской архитектурой некоторые трюки типа
$+2,
STA M+1
не столь актуальны, как для архитектуры фон Неймана, поскольку память программ и данных разделены.
То есть, красивым трюком
STA M+1 программу как в
i8080 не подправишь, а с памятью данных такой
финт не выглядит эффективным - этой памяти всего 16 нибблов...
Поэтому на данный момент анализ мат.операции я вставил лишь для кодов с адресом, где результат
может достигать 4096. В остальных случаях аргумент не более 15, и есть ли необходимость что-либо
вычислять - я пока сомневаюсть. Глубину стеков, кстати, уменьшил до 20.
Поработаю пока с этим ассемблером и аппаратной частью
4-bit Processor-а, для которого он и был написан.
Результаты выложу по готовности. Всё равно сам по себе этот ассемблер никому отдельно не нужен...
You do not have the required permissions to view the files attached to this post.