我正在编写自己的词法分析器,并且想知道如何正确处理标识符以保留字开头的情况。目前,词法分析器将整个第一部分作为保留字匹配,然后将其余部分分开,因为保留字是最长匹配(在下面的示例中为' vs' s' s)。
例如规则:
RESERVED_WORD := self
IDENTIFIER_CHAR := [A-Z]|[a-z]
适用于:
selfIdentifier
'自'匹配为RESERVED_WORD
和'我'当整个字符串应匹配为IDENTIFIER_CHAR
s
IDENTIFIER_CHAR
答案 0 :(得分:1)
大多数词法生成器的标准答案是匹配最长序列的正则表达式获胜。要在两个匹配完全相同数量的正则表达式之间打破平局,请按照它们在定义文件中出现的顺序优先使用第一个正则表达式。
您可以在词法分析器中模拟此效果。然后将“selfIdentifier”视为标识符。
如果你正在编写一个有效的词法分析器,你将拥有一个基于当前字符类从一个状态分支到另一个状态的有限状态机。在这种情况下,如果FSA无法切换到另一个状态,您将有几个状态可以是终端状态,而是终端状态。您可以为每个此类终端状态分配令牌类型;令牌类型将是唯一的。