词法分析问题

3

我正在阅读《龙书》。引用书中的文本(3.1.4词法错误,第114页)

It is hard for a lexical analyzer to tell, without the aid of other components, that there is a source-code error. For instance, if the string fi is encountered for the first time in a C program in the context:

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

a lexical analyzer cannot tell whether fi is a misspelling of the keyword if or an undeclared function identifier. Since fi is a valid lexeme for the token id, the lexical analyzer must return the token id to the parser and let some other phase of the compiler - probably the parser in this case - handle an error due to transposition of the letters.

我读完后有些困惑。我的理解是词法分析器从左到右处理文本,并在模式匹配时返回标记。因此,对于一个需要匹配关键字if的语言,如何可以匹配fi
有什么想法吗?
4个回答

7

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

fi ( a  == f(x) );

啊哈,现在我懂了。谢谢。 - Navaneeth K N

2
你必须区分语法分析和词法分析。
词法分析的任务是将一系列字符转换为标记字符串。可以有各种类型的标记,例如标识符、加法运算符、结束语句运算符等。如果词法分析遇到不对应任何标记的文本字符串,则只能以错误失败。在你的情况下,fi ( a == f(x) ) ...将被翻译为<IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <EQUALITY> <IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <RIGHT BRACKET> <RIGHT BRACKET>......
生成标记字符串后,执行语法分析。这通常涉及从标记中构建某种语法树。解析器了解语言允许的所有有效语句形式。如果解析器找不到允许上述标记序列的语法规则,则会失败。

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" 返回给解析器。然后解析器稍后会意识到语法错误。

这与从左到右或从右到左没有任何关系。编译器当然是从左到右读取源代码的。正如我所说,这个解释使用了一个不好的关键字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接