[关闭]
@UDvoid 2014-11-18T23:52:36.000000Z 字数 3457 阅读 2778

C0文法分析


可以看网页版点这里
<加法运算符> ::= +|-
加法运算符为+,-两种;

<乘法运算符> ::= *|/
同上类似

<关系运算符> ::= <|<=|>|>=|!=|==
关系运算符有<, <=, >, >=, !=, ==;

<字母> ::= _|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就是字符串;

<程序> ::= [<常量说明部分>][<变量说明部分>]{<有返回值函数定义部分>|<无返回值函数定义部分>}<主函数>
程序中可包含常量说明部分、变量说明部分、有返回值的函数定义部分、无返回值的函数定义部分,这四个部分可有可无,但程序中最后必须要有主函数;

  1. int a;
  2. const int b = 10;
  3. int work(int aa, int bb)
  4. {
  5. return aa + bb;
  6. }
  7. void danteng()
  8. {
  9. }
  10. //上面的部分可有可无,但要有下面的main函数才算是一个程序;
  11. void main()
  12. {
  13. }

<常量说明部分> ::= const<常量定义>;{ const<常量定义>;}
常量说明部分由一个以上的const+<常量定义>组成;

<常量定义> ::= int<标识符>=<整数>{,<标识符>=<整数>}
| float<标识符>=<实数>{,<标识符>=<实数>}
| char<标识符>=<字符>{,<标识符>=<字符>}
常量定义部分由一个以上的int(或float、char)+标识符+整数(或实数、字符)组成;可通过逗号连接同一类型常量的多个标识符的定义;

  1. const int a = 2;
  2. const int b = 1, c = 2;
  3. 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;

<有返回值函数定义部分> ::= <声明头部>‘(’<参数>‘)’ ‘{’<复合语句>‘}’
有返回值的函数定义部分由声明头部+‘(’参数‘)’+‘{’复合语句‘}’组成;

  1. int work(int a)
  2. {
  3. return a;
  4. }

<无返回值函数定义部分>::=void<标识符>‘(’<参数>‘)’‘{’<复合语句>‘}’
无返回值的函数定义部分由void+标识符+‘(’参数‘)’+‘{’复合语句‘}’构成;

  1. int a = 1, b = 2, c = 3;
  2. void work(){ //此时参数为空
  3. a = b + c;
  4. }

<复合语句> ::= [<常量说明部分>][<变量说明部分>]<语句列>
复合语句由常量说明部分、变量说明部分、语句列组成,其中前两项可选;

<参数> ::= <参数表>
参数表组成了参数部分;

<参数表>::=<类型标识符><标识符>{,<类型标识符><标识符>}| <空>
参数表可以为空,不为空是有一个或多个类型+标识符组成,用逗号连接;

<主函数> ::= void main‘(’‘)’ ‘{’<复合语句>‘}’
主函数类似无返回值的函数定义,不过标识符固定为main且参数为空;

  1. void main()
  2. {
  3. int a, b;
  4. a = 1;
  5. }

<表达式>::= [+|-]<项>{<加法运算符><项>}
表达式由项开头,后面有0个以上的加法运算符+项,开头的项前面可选择是否需要加法运算符;

<项> ::= <因子>{<乘法运算符><因子>}
项为单个因子或是若干个因子的乘除运算组成;

<因子> ::= <标识符>|<标识符>‘[’<表达式>‘]’|<整数>|<实数>|<字符>|<有返回值函数调用语句>|‘(’<表达式>‘)’
一个因子可以是标识符、数组的某个值、整数、实数、字符、有返回值的函数的调用语句、圆括号里的表达式,总之就是代表一个值;

<语句>::= <条件语句>|<循环语句>|‘{’<语句列>‘}’|<有返回值函数调用语句>|<无返回值函数调用语句>;|<赋值语句>;|<读语句>;|<写语句>;|<空>;|<返回语句>;
语句可以是条件语句、循环语句、函数调用语句、赋值语句、读语句、写语句、返回语句、空、大括号内的语句列;

<赋值语句> ::= <标识符>=<表达式>|<标识符>‘[’<表达式>‘]’=<表达式>
赋值语句为标识符=表达式 或标识符'['表达式']' = 表达式(数组);
如 a = 1, b[10] = 15;

<条件语句> ::= if ‘(’<条件>‘)’<语句>[else<语句>]
直接示例:

  1. if(a == 3) //a == 3 是条件
  2. {
  3. b = 5; //条件为真执行语句
  4. }
  5. //下面的部分可有可无
  6. else
  7. {
  8. b = 4
  9. }

<条件> ::= <表达式><关系运算符><表达式>|<表达式> //表达式为0条件为假,否则为真
条件为表达式或表达式+关系运算符+表达式,关系运算的结果只有0或1,单个表达式条件非0即真;

<循环语句> ::= do<语句>while ‘(’<条件>‘)’ |for‘(’<标识符>=<表达式>;<条件>;<标识符>=<标识符>(+|-)<步长>‘)’<语句>
循环语句有do-while语句,for语句两种;
示例:

  1. //do while 语句
  2. do{
  3. 语句;
  4. }while(条件) //条件成立则继续循环;
  5. //for语句
  6. for(i = 1; i < 10; i=i+5){ //条件i < 10 为真则继续循环,每次循环之后
  7. 语句; //执行i = i + 5;步长为5;
  8. }

<步长>::= <非零数字>{<数字>}
步长和无符号整数的定义一致,含义是每一次循环i增加的值;

<有返回值函数调用语句> ::= <标识符>‘(’<值参数表>‘)’
<无返回值函数调用语句> ::= <标识符>‘(’<值参数表>‘)’
两种函数的调用方式一样,均为标识符‘(’值参数表‘)’;

  1. int work(int a)
  2. {
  3. return 2 * a;
  4. }
  5. void main()
  6. {
  7. int a;
  8. a = work(5);//函数调用
  9. }

<值参数表> ::= <表达式>{,<表达式>}|<空>
1个以上的表达式,用逗号连接,可以为空;

<语句列> ::= <语句>{<语句>}
1个以上的语句构成语句列;

<读语句> ::= scanf ‘(’<标识符>{,<标识符>}‘)’
<写语句> ::= printf‘(’<字符串>,<表达式>‘)’|printf ‘(’<字符串>‘)’|printf ‘(’<表达式>‘)’
读、写语句直接示例:

  1. scanf(a);
  2. scanf(a, b, v);
  3. //上面均为读语句
  4. printf(aaa, a + b);
  5. printf(aaa); //原样输出aaa
  6. printf(a + b); //输出a + b的结果
  7. //这三种为写语句的例子

<返回语句> ::= return[‘(’<表达式>‘)’]
返回语句即

  1. return; //无返回值时
  2. return 返回值;

是函数的结束;

附加说明:

(1)char类型的表达式,用字符的ASCII码对应的整数参加运算,在写语句中输出字符

(2)标识符区分大小写字母

(3)写语句中的字符串原样输出

(4)数组的下标从0开始

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注