如何避免解析器中的大量if-else语句

时间:2012-09-07 13:10:31

标签: assembly

我是汇编程序设计领域的新手。我正在为一台机器设计自己的汇编程序。目前,我的汇编程序获取第一个标记(假定它是一个指令),然后尝试生成相应的目标代码。现在我需要将令牌与助记符池匹配,然后生成相应的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字符串变量调用函数吗?

3 个答案:

答案 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(另一个编译器编译器),您可以使用它来为您的新语言生成编译器。

以下是一个有用的指南:http://ds9a.nl/lex-yacc/cvs/lex-yacc-howto.html

答案 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);

如果每个函数需要不同数量的参数,functionoidboost::function可能是正确的选择,而不是简单的函数指针。