词法分析中的困惑

Confusion in lexical analysis

让我们来看看词法分析中标识符的状态图。基本上,每当分析器读取除数字字母以外的任何字符时,它表示 return 令牌作为 (identifier,attribute) 对。所以,根据这个规则, 在读取字符串 dtf56*f%%f 时,生成的令牌是否如下所示?

dtf56: 标识符

f: 标识符

f: 标识符

我想在这种情况下词法分析器应该抛出一个错误,因为这是一个单一的字符串。作为一个一般性问题,词位应该 return 在什么 "other" 个字符处编辑?

如果星号和百分号是合法字符,那么它们也应该 return 分开。你第一句话的要点是,当遇到不能属于它的字符时,分析应该停止并且 return 到目前为止积累的标记。

What I am confused about is when should I return a lexeme. For example, for the string 56fdt, should I return 56 as integer and fdt as an identifier? Or, should I throw an error?

根据您的状态图,您应该 return 将它们分开。标识符只能以字母开头。这就是符号的含义。

如果您遇到的字符不属于您正在扫描的语言的字母表,并且使用 flex(1)[ 等实用工具,您应该只 'throw an error' =23=] 实际上更好的是 return 那些给解析器(假设 yacc(1) 和朋友)让解析器的 error-recovery 规则采取效果,而不仅仅是打印可能很长的 'illegal character' 错误字符串。

So, the bottom-line is to follow the state transition diagrams without question? (I feel like a knucklehead while asking this question).

状态图说如果你在状态 9 找到一个字母,转换到状态 10,并在你有更多的字母或数字时保持在状态,然后,当停止时,输出累积的令牌作为 ID。如果它对于您正在分析的语言是正确的,您当然应该毫无疑问地遵循状态图。 [有些语言中 56fdt 是合法的标识符,但在那种情况下状态图会不同,非常不同。]