如何处理lexer中作为有限自动机实现的空格?

时间:2012-05-16 17:40:30

标签: compiler-construction whitespace lexer automata

我为一种简单的编程语言创建了词法分析器。现在我使用确定性有限自动机而不是正则表达式(Java中的RegEx)。自动机工作得很好,除非它不会报告错误,例如,如果我在源代码中有moduclouds(模块和云都是关键字)。相反,它会创建两个名为KW_MODULE和KW_CLOUDS的标记。有人可能会说,如果自动机处于KW_MODULE的最终状态,我可以向前看空白空间。但这不能解决问题,因为在语言中我可能会有类似8-6(不用空格分隔)的东西,这些东西可以正确地转换成令牌INT DASH INT。

我知道在解析器的语法中处理空格并不是一个好主意。

我的自动机实现为矩阵(行是状态,列是字母表中的字符,单元格是过渡状态)。当自动机进入最终状态时,我将自动机重置为从启动状态开始。

我认为问题是因为这种编程语言不使用分号。例如:

模块; 云;

相反,它使用空格来分隔线条: 模 云

提前致谢。

问候。

1 个答案:

答案 0 :(得分:1)

FWIW,我工作过的解析器通过要求关键字也是语法定义的正确标识符来处理这个问题。

所以,例如如果您将标识符定义为可选地后跟更多字符或数字的字符,则任何关键字也必须适合该模具。然后,词法分析器仅将一个标记视为潜在关键字,如果它已被归类为标识。

我很想知道其他人如何处理这个问题。