2017-02-12 54 views
1

让我们看看词法分析中标识符的状态图。基本上,它说,只要分析仪读取除数字字母之外的任何字符,则将该标记返回为(标识符,属性)对。所以,根据这条规则, 在读取字符串dtf56 * f %% f时,生成的令牌如下?词法分析中的混淆

dtf56:标识符

F:标识

F:标识

我想的是,词法分析器应该在这种情况下,抛出一个错误,因为这是一个字符串。作为一个普遍的问题,什么“其他”字符应该返回一个词位呢?

State diagram for identifiers

+0

如果使用星号和百分号为合法字符,它应该返回他们也分开。你的第一句话的重点是分析应该停止并返回到目前为止累积的令牌,当遇到不能成为它的一部分的字符时。但是,即使没有引用它,谈论一些未知的状态图也没什么意义。 – EJP

+0

我的不好。我现在添加了状态图。 –

+0

我感到困惑的是什么时候应该返回一个词位。例如,对于字符串56fdt,我应该返回56作为整数和fdt作为标识符?或者,我应该抛出一个错误? –

回答

3

如果使用星号和百分号是合法的字符,它应该返回他们也分开。你的第一句话的重点是分析应该停止并返回到目前为止累积的令牌,当遇到不能成为它的一部分的字符时。

我感到困惑的是什么时候应该返回一个词位。例如,对于字符串56fdt,我应该返回56作为整数和fdt作为标识符?或者,我应该抛出一个错误?

根据你的状态图你应该单独返回它们。标识符只能以字母开头。这就是符号的意思。

如果你遇到一个角色,是不是你要扫描的语言的字母表的一部分,就应该只有“抛出一个错误”,并且实用的工具,如弯曲(1)它实际上是更好地将它们返回给解析器(假设yacc(1)和朋友)让解析器的错误恢复规则生效,而不是仅仅打印可能长的“非法字符”错误字符串。

那么,底线是毫无疑问地遵循状态转换图? (当我问这个问题的时候,我感觉自己像个kn手)脚)。

的状态图说,如果你发现在状态9日的信函,转换到状态10,并留在它,而你有更多的字母或数字,然后,当停止,输出的累计游戏币作为ID。如果你正在分析的语言正确,你应该毫无疑问地遵循状态图。 [有语言中56fdt是一个合法的标识符,但在这种情况下,状态图会有所不同,非常不同。]