Я бы предпочел держаться подальше от «слишком большой» объектной ориентации из-за проблем с производительностью.
аю 8051 ассемблер.
Прежде чем все станет токенизатором, который читает следующие токены, устанавливает флаги ошибок, распознает EOF и т. Д.
Затем идет основной цикл компилятора, который читает следующие токены и проверяет правильность мнемоники:
mnemonic= NextToken();
if (mnemonic.Error)
{
//throw some error
}
else if (mnemonic.Text == "ADD")
{
...
}
else if (mnemonic.Text == "ADDC")
{
...
}
И это продолжается в нескольких случаях. Хуже этого - код внутри каждого случая, который проверяет допустимые параметры, а затем преобразует его в скомпилированный код. Прямо сейчас это выглядит так:
if (mnemonic.Text == "MOV")
{
arg1 = NextToken();
if (arg1.Error) { /* throw error */ break; }
arg2 = NextToken();
if (arg2.Error) { /* throw error */ break; }
if (arg1.Text == "A")
{
if (arg2.Text == "B")
output << 0x1234; //Example compiled code
else if (arg2.Text == "@B")
output << 0x5678; //Example compiled code
else
/* throw "Invalid parameters" */
}
else if (arg1.Text == "B")
{
if (arg2.Text == "A")
output << 0x9ABC; //Example compiled code
else if (arg2.Text == "@A")
output << 0x0DEF; //Example compiled code
else
/* throw "Invalid parameters" */
}
}
Для каждой мнемоники я должен проверить правильность параметров, а затем создать правильный скомпилированный код. Очень похожие коды для проверки допустимых параметров для каждого мнемонического повтора в каждом случае.
Так есть ли шаблон дизайна для улучшения этого кода?
Или просто более простой способ реализовать это?
Изменить: я принял ответ плинтуса, благодаря ему. Тем не менее, если у вас есть идеи по этому поводу, я буду рад выучить их. Спасибо всем.