2

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

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

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

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

模块; 云;

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

提前致谢。

问候。

4

1 回答 1

1

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

因此,例如,如果您将标识符定义为可选地后跟更多字符或数字的字符,则任何关键字也必须适合该模式。然后,词法分析器仅在已被归类为 ident 的情况下才将标记视为潜在关键字。

不过,我很想听听其他人如何处理这个问题。

于 2012-05-16T18:34:47.603 回答