5

我正在Java为我的学期项目制作一个基本的词法分析器,但我与我的学科老师在一个概念上存在冲突。

我的观点是,一般来说,如果像“1a”这样的输入被提供给词法分析器,那么它应该给出如下输出:

"<Number><Identifier>"

但是,我的老师说它应该将此标记为错误,因为它不应将其视为数字和标识符,而是应将整个字符串(即“1a”)标记为错误。这是因为(正如他所说)标识符不能以数字开头。

相反,我认为这应该是编译器(语法分析器)下一阶段的责任,以决定某些东西是否是有效的标识符。我知道他对不以数字开头的标识符是正确的,但我需要关闭词法分析器应该决定这一点的部分。

我将非常感谢您的帮助。谢谢

4

4 回答 4

3

词法分析器应该处理哪些类型的标记是合法的或不合法的,并将文本划分为标记。如果字符串不能形成有效的标记,它将出错。

语法分析器仅在确定标记后处理程序的结构。如果无法根据给定的语法解析令牌,则会出错。

所以你的老师是对的。确定标识符是否合法属于词法分析。

于 2013-05-29T17:00:19.000 回答
2

我同意您的老师的观点,正确的标识符列表适用于词法分析器。 http://en.wikipedia.org/wiki/Lexical_analysis

于 2013-05-29T16:59:54.670 回答
0

原因是语言通常在数字上使用后缀,例如 C 中的 1L 是 long 类型的值 1 而不是默认类型 int。此外,您还希望能够在以后以一种语言添加后缀。考虑你的 1a。首先,这将被解析为 int 值 1,后跟标识符 a。但是现在编译器的创建者决定开始使用 a 作为数字的后缀。突然 1a 变成了一个单一的标记。

对于 1a 还有一种特殊情况,即 1a 可以表示为十六进制数字,但您忘记为 C 或某些汇编程序版本添加所需的后缀/前缀 0x1a 或 1ah。

于 2013-05-29T17:25:00.840 回答
0

在解析器中检测到这一点仅适用于数字后跟标识符恰好在语法上无效的语法。如果1 a在您的语言中是有效的语法,您将不得不在词法分析器中处理它,因为解析器无法区分1a(无空格)和1 a(有空格)。

为什么不在词法分析器中这样做?词法分析器的工作是使解析器的工作更容易。它可以做的任何工作来简化你的解析器而不会给词法分析器本身增加很多复杂性是一个好主意。

于 2013-06-01T00:03:09.190 回答