【问题标题】:Is string "1a" an error for lexical analyser or not?字符串“1a”是否是词法分析器的错误?
【发布时间】:2013-05-29 16:52:44
【问题描述】:

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

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

"<Number><Identifier>"

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

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

非常感谢您的帮助。谢谢

【问题讨论】:

    标签: java programming-languages lexical-analysis


    【解决方案1】:

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

    语法分析器仅在确定标记后处理程序的结构。如果无法按照给定的语法解析token,则会报错。

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

    【讨论】:

    • 为什么词法分析器不能读取'1',然后在'a'标志'1'作为数字停止,然后重新开始,然后读取'a'并将其标记为标识符。 'a' 不是 NFA 处理数字的分隔符吗?
    • 我会说标记化发生在预定义的分隔符上,通常是空格。为了让词法分析器将字符串分成 1 和 a,我们需要为此定义额外的规则。我认为您的老师的想法是 1a 是一个标记,并且由于它与标识符的正则表达式不匹配,因此词法分析器会出错。
    • 取决于词法分析器的编写方式。使用 flex 实际上很容易生成一个词法分析器,它将 1a 解析为一个数字后跟一个标识符。
    • 是的,这取决于分析仪。不过,及早发现错误是有好处的。如果后跟标识符的数字不是有效输入,并且您可以在词法分析阶段检测到这一点,那么最好这样做。
    • 非常感谢。您的回复让我明白了。我需要为我的每个 NFA 定义一个分隔符列表。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-07
          • 2010-10-21
          • 1970-01-01
          • 2011-02-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多