如果我写这个在我的Linux机器上运行,我可以使用flex / bison。现在我限制自己到一个8位的平台,我必须手工做,或不是?
解决方法
起初我考虑使用flex / bison。我决定反对这个选项有两个主要原因:
>默认情况下,Flex& Bison依赖于一些标准库函数(特别是对于I / O),它们不可用或者在avr-libc中不工作。我确定有支持的解决方法,但这是一些额外的努力,你将需要考虑。
> AVR有一个Harvard Architecture.C不是为了解决这个问题,所以即使常量变量被加载到RAM默认情况下。您必须使用特殊的宏/功能来存储和访问flash和EEPROM中的数据。 Bison创建一些相对较大的查找表,这些会很快吃掉你的RAM。除非我错了(这是可能的),你将不得不编辑输出源为了利用特殊的Flash& EEPROM接口。
拒绝Flex& Bison,我去寻找其他发电机工具。以下是我考虑的几个:
你可能还想看看Wikipedia’s comparison。
最后,我结束了手编码词法分析器和解析器。
对于解析我使用了递归下降解析器。我认为Ira Baxter已经做了足够的工作覆盖这个主题,并有大量的在线教程。
对于我的词法分析器,我为所有的终端写了正则表达式,绘制了等效的状态机,并将其实现为一个巨大的函数,使用goto的状态之间跳跃。这是单调乏味,但结果工作伟大。另外,goto是实现状态机的一个很好的工具 – 所有的状态都可以在相关代码旁边有清晰的标签,没有函数调用或状态变量开销,它的速度与你可以得到的一样快。 C真的没有一个更好的构造来构建静态状态机。
要考虑的事情:词法分析器实际上只是一个解析器的专业化。最大的区别是,正规语法通常足以用于词法分析,而大多数编程语言(大多数)具有上下文无关语法。所以,没有什么阻止你实现一个词法分析器作为递归下降解析器或使用解析器生成器写一个词法分析器。它通常不如使用更专门的工具那么方便。