【发布时间】:2013-05-15 17:55:51
【问题描述】:
我的微控制器有一个带有预定义命令集的 RS232 接口。有数百个命令,例如PRESSURE 50可以设置压力为50; LIMIT 60 可以设置一些限制为 60。
目前,这是使用一系列嵌套的 switch 语句处理的,但这似乎是一个不雅的解决方案。
处理这些命令的推荐/最有效/最易读的方法是什么? LUT 将是最整洁的,但肯定会有很多不存在的字母组合的空条目(不理想..)。
感谢您的任何想法..
【问题讨论】:
-
过去我把这个任务分成两部分:词法扫描和语法分析。词法扫描器将输入文本转换为标记。每个以空格分隔的单词按顺序与按字母顺序排列的相同长度关键字列表进行比较。匹配产生一个标记值。数字被转换为数字标记和二进制值。解析使用
switch和if语句查看how-to-write-a-compiler book 以了解其他想法。 -
这听起来会优化效率,但实际上会牺牲可维护性——我想让它尽可能地防止开发人员出错,因此按命令字符串长度排序的单独数组听起来像是自找麻烦。 .
-
为了解决您的还原论之痒,请参阅Boyer-Moore。
lexer基本上会生成 256 个入口状态机的表。我想strnstr()正在做类似的事情。 Boyer-Moore 比bsearch()快,因为您可以跳过字符。考虑 cat、cab 和 car。如果第一个字符匹配 c,则检查第三个字符并跳过第二个字符。 lexer 也可以对多个字符串执行此操作。 -
"...但确实会牺牲可维护性" -- 关键是将词法(字符串比较)与语法处理分开。单独的词法扫描允许命令的国际化或同义词。重点是代币。组织/维护字符串数组很简单。也许如果您计划解析的所有内容都是
的形式,那么这有点过头了。
标签: c serial-port embedded