这种类型的错误是在类型检查期间还是在解析输入时产生的?应该针对什么类型的错误进行处理?
CAST(TYPE a, UNARY_MINUS(TERM b))
会怎么样? - rici(a)-b;
a
的不同,这可能是一个类型转换或者是一个减法操作:#include <stdio.h>
#if TYPEDEF
typedef double a;
#else
double a = 3.0;
#endif
int main() {
int b = 3;
printf("%g\n", (a)-b);
return 0;
}
a
,编译器必须将程序拒绝为语法上不正确的(这正是标准使用的词语)。
这个很简单:
<block>Hello, world</blob>
这是不规范的XML,但它不能通过CFG检测出来。(尽管如此,所有的XML解析器都会正确地拒绝它作为不合规的。) 在HTML/SGML的情况下,由于在某些明确定义的情况下可以省略结束标签,所以解析更加棘手,但仍然是确定性的;同样,精确定义标签的声明将决定有效输入的解析,很容易提供解析方式不同的输入取决于声明。
好的,不是一种编程语言。我有很多其他编程语言的例子,但我认为这个例子可能会触发其他的直觉。
考虑这两个语法正确的句子:
The sheep is in the meadow.
The sheep are in the meadow.
现在,怎么样:
The cow is in the meadow.
(*) The cow are in the meadow.
第二句话虽然含义明确,但是存在歧义(是名词还是动词出了问题?),但它显然不符合语法规则。但是为了知道这一点(以及其他类似的例子),我们必须知道sheep
有一个未标记的复数形式。实际上,许多动物都有未标记的复数形式,因此我认为以下所有内容都是符合语法规则的:
The caribou are in the meadow.
The antelope are in the meadow.
The buffalo are in the meadow.
但绝对不是:
(*) The mouse are in the meadow.
(*) The bird are in the meadow.
等等。
似乎有一个普遍的误解,即因为语法分析器使用上下文无关文法解析器,所以句法分析被限制在解析上下文无关文法上。这是不正确的。
在C(及其衍生语言)的情况下,语法分析器使用符号表来帮助解析。在XML的情况下,它使用标签堆栈,在广义SGML(包括HTML)的情况下,它还使用标签声明。因此,作为整体考虑的语法分析器比CFG更强大,而CFG只是分析的一部分。
给定程序通过语法分析并不意味着它在语义上是正确的。例如,语法分析器需要知道a
是否是类型,以便正确解析(a)-b
,但它不需要知道转换是否实际可能,在a
是类型的情况下,或者a
和b
是否可以有意义地相减,在a
是变量的情况下。这些验证可以在构建解析树后进行类型分析,但它们仍然是编译时错误。
class-name: identifier
,enum-name: identifier
,template-name: identifier
和其他各种标识符。很明显,C++解析器需要在解析过程中弄清楚每个标识符的类型。请看附录A中的段落,特别是A.1:“引入了新的上下文关键字......” - rici