我正在开发一个解析器来处理数百个可能的命令,其中一些有自己的子命令。我有一个分词器将命令提取到一个对象中,但从那里我只有一个非常长的 if 语句列表,用于检查每个单独的情况。
是否有更好或更有效的方法来检查每个个案而不是 100 多个指定的 if 语句?
例如,命令可以是:A,CONFIG,SET,GARBLE,5。这将开始将乱码的配置设置为 5。但这不同于 A、CONFIG、SET、JAM、5 或其他命令,如 P、DO、ACTION,它本身完全是另一个命令。
现在我的程序用单独的 if 语句涵盖了所有这些情况,但我觉得它真的很低效。如果你是最后一个命令,那么无论如何你都会花费最长的时间。有没有更好、更实用的方法来做到这一点?
如果您需要代码示例,它真的像听起来一样简单。在获得充满标记化命令的对象后,我进行了一次绝对巨大的检查,它在哪里单独寻找像 if (command == "P")
之类的东西启动到 P 命令的命令处理程序中。
最佳答案
根据您的命令的复杂程度,这可能是“真正的”解析器的工作,可以是手动递归下降解析器,也可以是使用 lexx 和 yacc 等工具构建的解析器。
或者,如果这对您的用例来说太过分了,您可以使用函数指针或命令对象的哈希表,在表中查找命令并调用对象上的函数或方法来处理它。在我看来,这比一堆 if
语句更易于维护。
关于c++ - 有什么比分析单个 if 语句负载更好的方式来分析大量情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31995738/