我为一种简单的编程语言创建了lexer。现在,我不再使用正则表达式(Java语言中的RegEx),而是使用确定性有限自动机。自动机工作得很好,但它不会报告错误,例如,如果我在源代码中有moduleclouds (模块和云都是关键字)。相反,它将创建两个名为KW_MODULE和KW_CLOUDS的令牌。有人可能会争辩说,如果自动机处于KW_MODULE的最终状态,我可以展望未来的空白。但这不会解决问题,因为在语言中,我可能会有类似8-6 (不用空格分隔)的东西,它们可以正确地转换为标记INT,DASH,INT。
我知道在解析器的语法中处理空格不是一个好主意。
我的自动机实现为矩阵(行是状态,列是字母表中的字符,单元格是过渡状态)。当自动机进入最终状态时,我将自动机重置为从开始状态开始。
我认为问题是因为这种编程语言没有使用分号。例如:
模块;云;
取而代之的是,它使用空白来分隔线:模块云
提前谢谢。
致以问候。
发布于 2012-05-17 02:34:48
FWIW,我工作过的解析器通过要求关键字也是语法定义的正确标识符来处理这个问题。
因此,例如,如果您将标识符定义为一个字符,后面可选地跟随更多字符或数字,则任何关键字也必须适合该模型。然后,词法分析器只在某个令牌已被归类为ident的情况下才将其视为潜在的关键字。
不过,我很想听听其他人是如何处理这个问题的。
https://stackoverflow.com/questions/10623771
复制相似问题