3

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

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

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

词法分析器无法判断 fi是关键字拼写错误 if还是未声明的函数标识符。由于fi是标记 id 的有效词位,词法分析器必须将标记返回id给解析器,并让编译器的其他阶段——在这种情况下可能是解析器——处理由于字母转置引起的错误。

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

有什么想法吗?

4

4 回答 4

7

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

fi ( a  == f(x) );
于 2010-07-10T18:10:55.607 回答
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>......

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

于 2010-07-10T18:15:12.913 回答
1

您如何判断是否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

于 2010-07-10T18:11:26.473 回答
1

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

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

于 2010-07-10T18:12:24.280 回答