我是汇编程序设计领域的新手。我正在为一台机器设计自己的汇编程序。目前,我的汇编程序获取第一个标记(假定它是一个指令),然后尝试生成相应的目标代码。现在我需要将令牌与助记符池匹配,然后生成相应的obj代码。问题是我目前使用if-else结构,即
if(strcmp(mnemonic_read, "mov")==0)
// generate code for mov instr
else if(strcmp(mnemonic_read,"cmp")==0)
// generate code for cmp
我可以在不使用大量if-else语句的情况下完成所有这些操作吗?我可以通过mnemonic_read
字符串变量调用函数吗?
答案 0 :(得分:2)
你应该使用一种哈希表,而不是几十个和几十个if-else语句,甚至是switch-construct。
还要确保从简单的解析器逻辑中分离出“汇编器逻辑”。
答案 1 :(得分:2)
这是一个常见的问题,有一个共同的解决方案(哈罗建议)。
您可能需要查看在* nix环境中运行良好的lex / yacc或flex / bison。 Antlr做了类似的事情,但使用Java。
例如,您可以使用lex(From http://dinosaur.compilertools.net/):
Lex source是一个正则表达式和相应程序片段的表。该表被转换为一个程序,该程序读取输入流,将其复制到输出流并将输入分区为与给定表达式匹配的字符串。当识别出每个这样的字符串时,执行相应的程序片段。
因此,在lex中,您可以指定令牌(与正则表达式匹配)以及要生成的相应代码。您还可以将令牌提供给yacc(另一个编译器编译器),您可以使用它来为您的新语言生成编译器。
答案 2 :(得分:1)
您可能需要某种associative array哈希映射来存储关键字。这基本上是一个由任何类型索引的数组(对你的问题很有用,可能是一个字符串),它包含的值可能是一个函数指针。然后,您将为每个解析的命令调用不同的函数。
假设您正在使用代码片段中的C ++编写
// map strings to function pointers
// which take a string (maybe the operands) as parameter
map<string, void (*)(string)> commands;
在构造函数或类似的初始化例程中,您需要设置哈希映射(基本上充当跳转表):
init() {
commands["mov"] = cmd_mov;
commands["cmp"] = cmd_cmp;
...
}
void cmd_mov(string operands) {
// generate move instruction
}
void cmd_cmp(string operands) {
// generate cmp instruction
}
您只需通过
调用该功能string mnemonic = mnemonic_read_cmd();
string operands = mnemonic_read_op();
*(commands[mnemonic])(operands);
如果每个函数需要不同数量的参数,functionoid或boost::function
可能是正确的选择,而不是简单的函数指针。