【问题标题】:Question on lexical analysis关于词法分析的问题
【发布时间】:2010-07-10 18:07:12
【问题描述】:

我在看龙书。引用书中的文字(3.1.4 词汇错误,Pno 114)

词法分析器很难 告诉,无需其他人的帮助 组件,有一个 源代码错误。例如,如果 遇到字符串fi 第一次在 C 程序中 上下文:

fi ( a == f(x) ) ...

词法分析器无法判断是否 fi 是关键字的拼写错误 if 或未声明的函数 标识符。因为fi 是有效的 用于标记 id 的词素,词法 分析器必须将令牌 id 返回给 解析器并让其他阶段 编译器 - 可能是解析器 这种情况 - 处理由于 字母换位。

读完后我有点困惑。我的理解是词法分析器开始从左到右处理文本,并在模式匹配时返回标记。那么对于if 是要匹配的关键字的语言,fi 如何匹配?

有什么想法吗?

【问题讨论】:

    标签: c algorithm lexical-analysis compiler-construction


    【解决方案1】:

    它不匹配if 令牌,而是id 令牌,它代表“标识符”。如果没有关键字匹配,这是包罗万象的。词法分析器不知道在某些位置“期望”什么。它只返回标记,解析器将知道它期望什么。 C 解析器必须接受以下语句,例如,这是一个函数调用

    fi ( a  == f(x) );
    

    【讨论】:

    • 啊……现在说得通了。谢谢
    【解决方案2】:

    你必须区分语法分析和词法分析。

    • 词法分析的任务是将字符序列转换为标记字符串。可以有各种类型的标记,例如 IDENTIFIER、ADDITION OPERATOR、END OF STATEMENT OPERATOR 等。词法分析只有在遇到与任何标记不对应的文本字符串时才会失败并出现错误。在您的情况下,fi ( a == f(x) ) ... 将转换为 <IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <EQUALITY> <IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <RIGHT BRACKET> <RIGHT BRACKET> .....

    • 一旦生成了标记字符串,就会执行语法分析。这通常涉及从标记构建某种语法树。解析器知道语言中允许的所有形式的有效语句。如果解析器找不到允许上述标记序列的语法规则,它将失败。

    【讨论】:

      【解决方案3】:

      您如何判断if 是否是给定点的唯一预期输入?

      int a = 42;
      if (a == 42)
          puts("ok");
      

      对比

      int a = 42;
      fi (a == 42)
          puts("ok");
      

      fi 可能是一个函数调用。例如,上面的可能是以下的拼写错误:

      int a = 42;
      fi(a == 42);
      puts("ok");
      

      其中fi 是一个接受int 并返回void 的函数。

      【讨论】:

        【解决方案4】:

        对于词法分析错误解释,这是一个糟糕的示例选择。本文试图告诉您的是,编译器无法识别您拼错了“if”关键字(将其倒写)。它只看到“fi”,例如一个有效的变量名,因此将 id(例如)“VARIABLE”返回给解析器。解析器随后会发现语法错误。

        它与从左到右或从右到左无关。编译器当然是从左到右读取源代码。正如我所说的 - 这个解释的关键字选择不佳。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-29
          • 2020-01-22
          • 1970-01-01
          • 2014-10-01
          相关资源
          最近更新 更多