在C类语言中,分号(;)是一条语句的结束符。在Pascal中,由于分号也几乎存在于每条语句的末尾,导致很多不够细心的Delphi程序员误以为分号也是Pascal的语句结束符。实际上,在Pascal语言中,分号只是语句之间的分隔符,与语句结尾差很多。举个极常见的例子,if条件语句的语法是:
if BooleanExpression then TruePart [else FalsePart]
其中TruePart与FalsePart都是标准的语句(Statement)。如果在TruePart后加上分号,则编译器会认为该if语句已经结束,而else将成为下条语句的开始,导致一个语法错误。
在Pascal中一共有15种基本语句形式,包括:2种条件语句(if,case),3种循环语句(for,while,repeat...until),2种异常控制语句(try...finally...end,try...except...end),4种转移控制语句(exit,break,continue,goto),以及4种其它语句(赋值,函数调用,with,raise)。此外,还有一个特殊的语句,用来包裹多条语句形成一个语句块,并且其语法地位仍然只相当于一条语句:begin...end。包括上面说语句中,凡是能够用来包裹语句的,我都用“...”保留了可以包裹多条语句的位置。需要注意的是try...except结构,当except段中使用了“on [ExceptionObject:] ExceptionType do”之后,则变为do的语义:与for、while、with相同,do语法要求后面跟一条语句。在这些用“...”标识了的地方,就可以用“Statement [; Statement]”来分隔多条语句,而任何要求单条语句的地方,也都可以使用begin...end块来包裹多条语句。在函数的实现部分,直接语法要求必须用“begin...end”来包裹函数体,这样就可以直接写多条语句了。
我想,就算是非常清楚Pascal语言中分号地位的人,绝大多数也会习惯在每一段语句块后加上分号(当然if语句的TruePart除外)。这种情况下,这个语句块中的最后一条语句是条空语句,现在的编译器都能够正确处理空语句的情况,所以,完全可以在最后一条语句后加上一个分号。
本文的目的,是为了帮助理解Pascal的语法,不要以为if语句的TruePart是个特殊的地方,不能跟分号——实际上这里一点都不特别。非要说特殊的话,支持空语句才是特别的地方。
最后强调一下,本文只针对语句,不包括声明,千万不要过度理解。