语义说明

语义说明

编写中

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中,我们对变量定义做了一些限制

  1. YC1只支持有限的3种数据类型,分别是int, float, void,(void只能作为函数返回值的类型)。
  2. 所有变量必须在定义的时候初始化。
  3. 一次只能定义一个变量。

关于上述要求,以下是几个例子:

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分支语句,不支持switchgoto

  1. 每个if语句,可能包含一个else语句,但YC1不支持else if语句。
  2. ifelse里的内容必须使用大括号包裹,即使里面只有一个语句。

合法例子:

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循环,fordo 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;
}

YC2

数组

For循环