3.1 什么是语法
程序设计语言中有各种各样的规则。比如,乘法运算比加法运算优先级高,所以 1+23 这样书写的算式是先计算 23 的。语法就是程序语言设计者规定的解释程序编写方式的一系列规则。在第 2 章中,我们讲到程序设计语言是为了带来便捷而创造的,那么语法又会是为何而创造出来的呢 1 ?
1语法和句法有什么差别呢?也许有人要问这个问题。两者都是编写程序时要遵循的规则,只是句法的含义仅限于较小的范围。比如,称 if 语句为句法是很自然的,但称运算符的优先顺序为句法就很不自然了。第 4 章还会讨论诸如 if 语句、for 语句这样的控制句法,所以本章只使用语法一词。
本章我们来讨论乘法运算和加法运算的规则。当今主流的算式表达方法很复杂,我们来讲解一下简单一些的 FORTH 语言和 LISP 语言。 FORTH 语言基本上是没有语法的,而 LISP 语言通过括号来表现代码的结构。FORTH 语言和 LISP 语言所具有的功能是当今程序设计语言重要的组成部分。
运算符的优先顺序
大家使用的语言,肯定可以表达像 1+23 这样的加法和乘法运算。运算符指的就是加法运算里的 + 号和乘法运算里的 号。
然而,1+23 这样的源代码,先是 1 加 2 再把结果与3相乘即 (1+2)3 呢,还是先 2 乘 3 再把结果与 1 相加即 1+(2*3) 呢?这个顺序是怎么规定的呢?
答案是怎么方便就怎么规定。比如,以前有些计算器计算 1+23 的 结果有可能是 9,也就是执行的 (1+2)3。而现在大家使用的程序设计语言大多数的计算结果都应该是 7。这是因为程序语言设计者制定了乘法优先级高于加法先行计算这一规则。考虑到这和四则运算的法则是一致的,大家理解起来一点也不费劲。
那么,对于除法运算 9/3/3,是 9/(3/3) 呢,还是 (9/3)/3 ?这又是如何规定的呢?大部分的语言中都是按照 (9/3)/3 来计算 。这是因为程序语言设计者制定了这样的规则:在左结合运算符除号出现并列的情况下,运算从左开始计算。
语法是语言设计者制定的规则
语言设计者制定的规则就是语法。语法因语言而异。运算符的存在类型也因语言而异。比如 C 语言中的赋值符=是运算符。但它与普通的加减乘除运算符不同,是右结合运算符。所以源代码中 X = Y = 1 这样的语句,被解释为 X=(Y=1)2。
2与这不同的是,Python 语言中的赋值符=不是运算符而是一种句式,在运算式中不能出现。
