Я делаю ассемблер 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" */
}
}
Для каждой мнемоники я должен проверить допустимые параметры, а затем создать правильный скомпилированный код. Очень похожие коды для проверки допустимых параметров для каждого повторения мнемоники в каждом случае.
Так есть ли шаблон проектирования для улучшения этого кода?
Или просто более простой способ реализовать это?
Edit: Я принял ответ плинтуса, благодаря ему. Тем не менее, если у вас есть идеи по этому поводу, я буду рад их изучить. Всем спасибо.