我正在Java
为我的学期项目制作一个基本的词法分析器,我与我的学科老师发生冲突。
我的观点是,一般来说,如果给词法分析器输入“1a”之类的输入,那么它应该输出为:
"<Number><Identifier>"
但是,我的老师说它应该将此标记为错误,因为它不应将其视为数字和标识符,而应将整个字符串(即“1a”)标记为错误。这是因为(正如他所说的那样) )标识符不能以数字开头。
相反,我认为这应该是下一阶段编译器(语法分析器)的责任,以决定某些东西是否是有效的标识符。我知道他的标识符不是以数字开头是正确的,但是我需要关闭词法分析器应该决定的那个。
我将非常感谢你的帮助。谢谢
答案 0 :(得分:3)
词法分析器应该处理哪种类型的令牌合法与否,并将文本划分为令牌。如果字符串无法形成有效的令牌,则会出错。
语法分析器仅在确定令牌后才处理程序的结构。如果无法根据给定的语法解析令牌,则会出错。
所以你的老师是对的。确定标识符是否合法属于词法分析。
答案 1 :(得分:2)
我同意你的老师,正确的标识符列表适用于词法分析器。 http://en.wikipedia.org/wiki/Lexical_analysis
答案 2 :(得分:0)
原因是语言经常在数字上使用后缀,例如C中的1L是long类型的值1而不是默认类型int。此外,您希望以后能够使用某种语言添加后缀。考虑你的1a。首先,这将被解析为int值1,后跟标识符a。但是现在编译器的创建者决定开始在数字上使用a作为后缀。突然1a成为一个单一的标记。
对于1a,还有一个特殊情况,即1a可以表示为十六进制数,但是您忘记为某些汇编程序版本添加所需的后缀/前缀0x1a代表C或1ah。
答案 3 :(得分:0)
在解析器中检测到这一点只适用于语法符号,后面跟着标识符的数字在语法上无效。如果1 a
是您的语言中的有效语法,那么 可以在词法分析器中处理此问题,因为解析器无法区分1a
(无空格)和{{1 (用空格)。
为什么不在词法分析器中执行此操作?词法分析器的工作是使解析器的工作更容易。它可以做任何简化解析器而不给词法分析器本身增加很多复杂性的工作是个好主意。
答案 4 :(得分:-1)
我无法提供有关词典哲学问题的意见,但我可以为您的项目编码提供答案:
如果你想获得A,请按照他的建议进行编码。