2010-07-10 89 views
2

我正在读龙书。从书中引用的文本(3.1.4词法错误,PNO 114)词法分析问题

这是难的词法分析器 诉说,没有其他 组件的帮助下,有一个 源代码错误。例如,如果 字符串fi在 情况下遇到了 首次在C程序:

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

一个词法分析器无法分辨是否 fi是关键字 if或未经申报的拼写错误功能 标识符。由于fi是有效 词位的令牌ID,词法 分析仪必须返回令牌id到 解析器而让 一些其他阶段的编译器 - 大概在 解析器这种情况下 - 处理错误由于 换位的信件。

看完这个后我有点困惑。我的理解是词法分析器开始从左向右处理文本,并在模式匹配时返回令牌。因此,对于if是匹配关键字的语言,fi如何匹配?

有什么想法?

回答

7

它与if令牌不匹配,但是代表“标识符”的id令牌。如果没有关键字匹配,这就是全部。词法分析器不知道在某些位置“期望”什么。它只是返回令牌,解析器会知道它期望的。 A C解析器接受下面的语句,例如,这是一个函数调用

fi (a == f(x)); 
+0

啊..现在有道理。谢谢 – 2010-07-10 18:17:08

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

1

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

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

2

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

  • 词法分析的任务是将一系列字符转换为一个令牌字符串。可以有各种类型的标记,例如标识符,加法运算符,结束语句运算符等。词法分析只有在遇到不符合任何标记的文本字符串时才会出错。在你的情况下fi (a == f(x)) ...将转化为<IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <EQUALITY> <IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <RIGHT BRACKET> <RIGHT BRACKET> .....

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

+0

谢谢。现在很清楚。 – 2010-07-10 18:18:26