【发布时间】:2011-04-07 19:49:27
【问题描述】:
我正在制作一个 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" */
}
}
对于每个助记符,我必须检查有效参数,然后创建正确的编译代码。在每种情况下检查每个助记符重复的有效参数的代码非常相似。
那么有没有改进此代码的设计模式?
或者只是一种更简单的实现方式?
编辑:感谢他,我接受了 plinth 的回答。不过,如果您对此有想法,我将很乐意学习它们。谢谢大家。
【问题讨论】:
标签: c++ design-patterns assembly compiler-construction