Compiler-C-to-MIPS

<加法运算符> ::= +|-
<乘法运算符> ::= *|/
<关系运算符> ::= <|<=|>|>=|!=|==
<字母> ::= _|a|...|z|A|...|Z
<数字> ::= 0|1|...|9
<字符> ::= '<加法运算符>'|'<乘法运算符>'|'<字母>'|'<数字>'
<字符串> ::= "{十进制编码为32,33,35-126的ASCII字符}" <程序> ::= [<常量说明>][<变量说明>]{<有返回值函数定义>|<无返回值函数定义>}<主函数>
<常量说明> ::= const<常量定义>;{ const<常量定义>;}
<常量定义> ::= int<标识符>=<整数>{,<标识符>=<整数>}
| char<标识符>=<字符>{,<标识符>=<字符>}
<无符号整数> ::= <数字>{<数字>}
<整数> ::= [+|-]<无符号整数>
<标识符> ::= <字母>{<字母>|<数字>}
<声明头部> ::= int<标识符> |char<标识符>
<常量> ::= <整数>|<字符>
<变量说明> ::= <变量定义>;{<变量定义>;}
<变量定义> ::= <变量定义无初始化>|<变量定义及初始化>
<变量定义无初始化> ::= <类型标识符>(<标识符>|<标识符>'['<无符号整数>']'|<标识符>'['<无符号整数>']''['<无符号整数>']'){,(<标识符>|<标识符>'['<无符号整数>']'|<标识符>'['<无符号整数>']''['<无符号整数>']' )} <变量定义及初始化> ::= <类型标识符><标识符>=<常量>|<类型标识符><标识符>'['<无符号整数>']'='{'<常量>{,<常量>}'}'|<类型标识符><标识符>'['<无符号整数>']''['<无符号整数>']'='{''{'<常量>{,<常量>}'}'{, '{'<常量>{,<常量>}'}'}'}'
<类型标识符> ::= int | char
<有返回值函数定义> ::= <声明头部>'('<参数表>')' '{'<复合语句>'}'
<无返回值函数定义> ::= void<标识符>'('<参数表>')''{'<复合语句>'}'
<复合语句> ::= [<常量说明>][<变量说明>]<语句列>
<参数表> ::= <类型标识符><标识符>{,<类型标识符><标识符>}| <空>
<主函数> ::= void main‘(’‘)’ ‘{’<复合语句>‘}’
<表达式> ::= [+|-]<项>{<加法运算符><项>}
<项> ::= <因子>{<乘法运算符><因子>}
<因子> ::= <标识符>|<标识符>'['<表达式>']'|<标识符>'['<表达式>']''['<表达式>']'|'('<表达式>')'|<整数>|<字符>|<有返回值函数调用语句>
<语句> ::= <循环语句>|<条件语句>| <有返回值函数调用语句>; |<无返回值函数调用语句>;|<赋值语句>;|<读语句>;|<写语句>;|<情况语句>|<空>;|<返回语句>; | '{'<语句列>'}'
<赋值语句> ::= <标识符>=<表达式>|<标识符>'['<表达式>']'=<表达式>|<标识符>'['<表达式>']''['<表达式>']' =<表达式> <条件语句> ::= if '('<条件>')'<语句>[else<语句>] <条件> ::= <表达式><关系运算符><表达式>
<循环语句> ::= while '('<条件>')'<语句>| for'('<标识符>=<表达式>;<条件>;<标识符>=<标识符>(+|-)<步长>')'<语句>
<步长>::= <无符号整数>
<情况语句> ::= switch ‘(’<表达式>‘)’ ‘{’<情况表><缺省>‘}’
<情况表> ::= <情况子语句>{<情况子语句>}
<情况子语句> ::= case<常量>:<语句>
<缺省> ::= default :<语句>
<有返回值函数调用语句> ::= <标识符>'('<值参数表>')'
<无返回值函数调用语句> ::= <标识符>'('<值参数表>')'
<值参数表> ::= <表达式>{,<表达式>}|<空>
<语句列> ::= {<语句>} <读语句> ::= scanf '('<标识符>')' <写语句> ::= printf '(' <字符串>,<表达式> ')'| printf '('<字符串> ')'| printf '('<表达式>')' <返回语句> ::= return['('<表达式>')']

另:关于类型和类型转换的约定:

  1. 表达式类型为char型有以下三种情况:
  • 表达式由<标识符>、<标识符>'['<表达式>']和<标识符>'['<表达式>']''['<表达式>']'构成,且<标识符>的类型为char,即char类型的常量和变量、char类型的一维、二维数组元素。
  • 表达式仅由一个<字符>构成,即字符字面量。
  • 表达式仅由一个有返回值的函数调用构成,且该被调用的函数返回值为char型
  • 除此之外的所有情况,<表达式>的类型都是int
  1. 只在表达式计算中有类型转换,字符型一旦参与运算则转换成整型,包括小括号括起来的字符型,也算参与了运算,例如(‘c’)的结果是整型。
  2. 其他情况,例如赋值、函数传参、if/while条件语句中关系比较要求类型完全匹配,并且<条件>中的关系比较只能是整型之间比,不能是字符型。