语义说明
编写中
YC1
在语言规范一章中,我们已经说了,YC1的文法是C语言文法的一个子集,因此YC1程序也是C语言程序。本节主要阐述YC1语言相对于C语言的一些特殊规定。
程序结构
一个YC1程序由数个声明(Declaration)构成,声明包括函数声明和变量声明。
变量
还记得C语言是怎么定义变量的吗?我们的YC语言与你之前所学的没有什么不同,例如,你可以像下面这样定义YC语言中的变量。
int a = 10; // 定义一个名叫a的整型变量,并赋初值为10
double b = 3.14; // 定义一个名叫a的双精度浮点型变量,并赋初值为3.14
但是,为了简单请见,在YC1中,我们对变量定义做了一些限制。
- YC1只支持有限的3种数据类型,分别是
int
,float
,void
,(void只能作为函数返回值的类型)。 - 所有变量必须在定义的时候初始化。
- 一次只能定义一个变量。
关于上述要求,以下是几个例子:
char a = 'c' // 不合法: 不支持char类型
int b = 10; // 合法
int c; // 不合法: 变量必须在定义的时候初始化
double d=10, e=9; // 不合法: 一次只能定义一个变量
表达式
诸如加减乘除,比较大小等运算的语句都被称为表达式。C语言支持相当多的表达式,如算术表达式,比较表达式,甚至位运算表达式,但是为了简便请见,YC1只支持部分基础的表达式,其他表达式将作为后续版本的扩展内容。
YC1支持的表达式按优先级从高到低如下表所示:
语义 | 运算符 | 结合性 | 例子 |
---|---|---|---|
括号 | () |
无 | (a+b) |
函数调用 | () |
左结合 | f(10) |
相反数,类型转换, 取反 | - (type) ! |
右结合 | -10, (int)3.14, !(a>b) |
乘除 | * / |
左结合 | 3*9, 10/2 |
加减 | + - |
左结合 | 3+10, 4-9 |
大小比较 | > >= < <= |
左结合 | a>b, a>=b, c<d, c<=d |
相等比较 | == != |
左结合 | a==b, a!=b |
关系与 | && |
左结合 | a>0&&b>0 |
关系或 | || |
左结合 | a>0 |
赋值 | = |
右结合 | a=b, a=b=c |
分支
YC1只支持if
分支语句,不支持switch
和goto
。
- 每个
if
语句,可能包含一个else
语句,但YC1不支持else if
语句。 if
或else
里的内容必须使用大括号包裹,即使里面只有一个语句。
合法例子:
if(a<0) { a = a+1; }
if(a<0) {
a = a+1;
} else {
b = b-1;
}
不合法例子:
if(a==2) { a=1; }
else if(a==3) { a=3; } // 不支持else if
// 即使只有一个语句也必须使用大括号
if(a==4) a = 3;
循环
YC1只支持while
循环,for
和do while
循环为后续版本的扩展内容。
- 与
if
一样,while
循环的循环体必须使用大括号包裹,即使里面只有一条语句。
函数
YC1支持函数,但是与C语言不同的是,YC1不能只定义函数声明而不实现,函数调用只能通过f(1,2,3)
的形式调用,不能通过函数指针。
以下是一个合法的函数定义和调用。
int add(int x, int y) {
return x+y;
}
// 与C类似, 你必须定义一个名叫main的主函数作为程序入口
int main() {
int c = add(1,2);
return 0;
}