@UDvoid
2014-11-18T23:52:36.000000Z
字数 3457
阅读 2778
可以看网页版点这里
<加法运算符> ::= +|-
加法运算符为+,-两种;
<乘法运算符> ::= *|/
同上类似
<关系运算符> ::= <|<=|>|>=|!=|==
关系运算符有<, <=, >, >=, !=, ==;
<字母> ::= _|a|...|z|A|...|Z
下划线和a-z的大小写形式为字母,如a、B、_都是字母;
<数字> ::= 0|<非零数字>
0或非零数字组成了数字
<非零数字> ::= 1|...|9
非零数字是1-9的数字;
<字符> ::= '<加法运算符>'|'<乘法运算符>'|'<字母>'|'<数字>'
加法运算符或乘法运算符或字母或数字都是字符;
如+、*、a、9都是字符;
<字符串> ::= "{十进制编码为32,33,35-126的ASCII字符}"
由十进制编码为32,33,35-126的ASCII字符任意个组成了字符串,可任意重复;
如abcc*_adsaaaa就是字符串;
<程序> ::= [<常量说明部分>][<变量说明部分>]{<有返回值函数定义部分>|<无返回值函数定义部分>}<主函数>
程序中可包含常量说明部分、变量说明部分、有返回值的函数定义部分、无返回值的函数定义部分,这四个部分可有可无,但程序中最后必须要有主函数;
如
int a;
const int b = 10;
int work(int aa, int bb)
{
return aa + bb;
}
void danteng()
{
}
//上面的部分可有可无,但要有下面的main函数才算是一个程序;
void main()
{
}
<常量说明部分> ::= const<常量定义>;{ const<常量定义>;}
常量说明部分由一个以上的const+<常量定义>组成;
<常量定义> ::= int<标识符>=<整数>{,<标识符>=<整数>}
| float<标识符>=<实数>{,<标识符>=<实数>}
| char<标识符>=<字符>{,<标识符>=<字符>}
常量定义部分由一个以上的int(或float、char)+标识符+整数(或实数、字符)组成;可通过逗号连接同一类型常量的多个标识符的定义;
如
const int a = 2;
const int b = 1, c = 2;
const char ch = 'y';
<无符号整数> ::= <非零数字>{<数字>}
无符号整数由非零整数开头,后跟上任意个(可为0)数字构成;
<整数> ::= [+|-]<无符号整数>|0
整数为0或是加法运算符+无符号整数,符号可有可无;
如0、-10、5等都是整数;
<小数部分> ::= <数字>{<数字>}|<空>
小数部分可以为空或0个以上的数字;
<实数> ::= [+|-]<整数>[.<小数部分>]
实数是整数或小数,如果是小数要在整数部分后加上.和小数部分;
如56、45.123456都是实数;
<标识符> ::= <字母>{<字母>|<数字>}
标识符由字母开头,后跟若干个字母或数字;
如hdskaj、jdsf656asd是标识符;
<声明头部> ::= int<标识符> |float <标识符>|char<标识符>
声明的头部由类型+标识符组成;
<变量说明部分> ::= <变量定义>;{<变量定义>;}
变量说明部分由1个以上的变量定义语句构成;
<变量定义> ::= <类型标识符>(<标识符>|<标识符>‘[’<无符号整数>‘]’){,<标识符>|<标识符>‘[’<无符号整数>‘]’ }
变量定义为类型+标识符或类型+标识符+‘[’无符号整数‘]’(数组);
多个定义可用逗号连接;
<类型标识符> ::= int | float | char
有三种类型标识符int、char、float;
<有返回值函数定义部分> ::= <声明头部>‘(’<参数>‘)’ ‘{’<复合语句>‘}’
有返回值的函数定义部分由声明头部+‘(’参数‘)’+‘{’复合语句‘}’组成;
如
int work(int a)
{
return a;
}
<无返回值函数定义部分>::=void<标识符>‘(’<参数>‘)’‘{’<复合语句>‘}’
无返回值的函数定义部分由void+标识符+‘(’参数‘)’+‘{’复合语句‘}’构成;
如
int a = 1, b = 2, c = 3;
void work(){ //此时参数为空
a = b + c;
}
<复合语句> ::= [<常量说明部分>][<变量说明部分>]<语句列>
复合语句由常量说明部分、变量说明部分、语句列组成,其中前两项可选;
<参数> ::= <参数表>
参数表组成了参数部分;
<参数表>::=<类型标识符><标识符>{,<类型标识符><标识符>}| <空>
参数表可以为空,不为空是有一个或多个类型+标识符组成,用逗号连接;
<主函数> ::= void main‘(’‘)’ ‘{’<复合语句>‘}’
主函数类似无返回值的函数定义,不过标识符固定为main且参数为空;
如
void main()
{
int a, b;
a = 1;
}
<表达式>::= [+|-]<项>{<加法运算符><项>}
表达式由项开头,后面有0个以上的加法运算符+项,开头的项前面可选择是否需要加法运算符;
<项> ::= <因子>{<乘法运算符><因子>}
项为单个因子或是若干个因子的乘除运算组成;
<因子> ::= <标识符>|<标识符>‘[’<表达式>‘]’|<整数>|<实数>|<字符>|<有返回值函数调用语句>|‘(’<表达式>‘)’
一个因子可以是标识符、数组的某个值、整数、实数、字符、有返回值的函数的调用语句、圆括号里的表达式,总之就是代表一个值;
<语句>::= <条件语句>|<循环语句>|‘{’<语句列>‘}’|<有返回值函数调用语句>|<无返回值函数调用语句>;|<赋值语句>;|<读语句>;|<写语句>;|<空>;|<返回语句>;
语句可以是条件语句、循环语句、函数调用语句、赋值语句、读语句、写语句、返回语句、空、大括号内的语句列;
<赋值语句> ::= <标识符>=<表达式>|<标识符>‘[’<表达式>‘]’=<表达式>
赋值语句为标识符=表达式 或标识符'['表达式']' = 表达式(数组);
如 a = 1, b[10] = 15;
<条件语句> ::= if ‘(’<条件>‘)’<语句>[else<语句>]
直接示例:
if(a == 3) //a == 3 是条件
{
b = 5; //条件为真执行语句
}
//下面的部分可有可无
else
{
b = 4;
}
<条件> ::= <表达式><关系运算符><表达式>|<表达式> //表达式为0条件为假,否则为真
条件为表达式或表达式+关系运算符+表达式,关系运算的结果只有0或1,单个表达式条件非0即真;
<循环语句> ::= do<语句>while ‘(’<条件>‘)’ |for‘(’<标识符>=<表达式>;<条件>;<标识符>=<标识符>(+|-)<步长>‘)’<语句>
循环语句有do-while语句,for语句两种;
示例:
//do while 语句
do{
语句;
}while(条件) //条件成立则继续循环;
//for语句
for(i = 1; i < 10; i=i+5){ //条件i < 10 为真则继续循环,每次循环之后
语句; //执行i = i + 5;步长为5;
}
<步长>::= <非零数字>{<数字>}
步长和无符号整数的定义一致,含义是每一次循环i增加的值;
<有返回值函数调用语句> ::= <标识符>‘(’<值参数表>‘)’
<无返回值函数调用语句> ::= <标识符>‘(’<值参数表>‘)’
两种函数的调用方式一样,均为标识符‘(’值参数表‘)’;
如
int work(int a)
{
return 2 * a;
}
void main()
{
int a;
a = work(5);//函数调用
}
<值参数表> ::= <表达式>{,<表达式>}|<空>
1个以上的表达式,用逗号连接,可以为空;
<语句列> ::= <语句>{<语句>}
1个以上的语句构成语句列;
<读语句> ::= scanf ‘(’<标识符>{,<标识符>}‘)’
<写语句> ::= printf‘(’<字符串>,<表达式>‘)’|printf ‘(’<字符串>‘)’|printf ‘(’<表达式>‘)’
读、写语句直接示例:
scanf(a);
scanf(a, b, v);
//上面均为读语句
printf(aaa, a + b);
printf(aaa); //原样输出aaa
printf(a + b); //输出a + b的结果
//这三种为写语句的例子
<返回语句> ::= return[‘(’<表达式>‘)’]
返回语句即
return; //无返回值时
或
return 返回值;
是函数的结束;
附加说明:
(1)char类型的表达式,用字符的ASCII码对应的整数参加运算,在写语句中输出字符
(2)标识符区分大小写字母
(3)写语句中的字符串原样输出
(4)数组的下标从0开始