- 顺序结构:赋值(=),输入(scan()),输出(print())
- 选择语句:if-else (允许使用级联形式)
- 循环结构:for, while
- 关系表达式:<, >, ==, !=, <=, >=
- 算术表达式: +, -, *, /, %, ()
- 逻辑表达式:||, &&
- 一元表达式:!, +, -
- 不支持进行位运算(|, &, ~)
- 不支持三元运算符(? :)
- 程序以函数为单位,main函数为程序入口
- 不支持在函数块外定义语句
- 语句以;作为结束,{}表示一个程序块
- 支持单行和多行注释 /*, //
- 变量使用前必须定义
- 函数使用前必须声明
- 支持数组运算,不支持指针和取地址运算,[]表示数组下标
- int 整型 (只支持十进制数)
- double 浮点型(支持科学计数法)
- 不支持char类型
-
Integer
digit ::= [0-9]
integer ::= [1-9][0-9]* -
Real
real ::= integer.digit+ -
String
char ::= ASCII码能表示的所有字符
literal ::= char* -
Identifier
alphabet ::= [a-zA-Z]
id ::= alphabet(alphabet|digit|_)* -
Keyword:if, else, while, for, print, scan, int, double, void, return, do
-
Operator:+, -, *, /, %, =, ==, <, >, <=, >=, !=, !, ||, &&, (, ), [, ]
-
Separator:{, }, ;, ", ,
-
Command://, /*, */
-
Identifier: 由数字、字母和下划线组成,但必须以字母开头
-
Value: number, string_literal
- program -> (func-declare)+
- func-declare -> func-sign func-define
- func-define -> { stmt-sequence } | ;
- func-sign -> type identifier ( arg-dec-list )
- arg-dec-list -> arg-declare arg-dec-clos | void | ε
- arg-dec-clos -> , arg-declare arg-dec-clos | ε
- arg-declare -> type identifier
- declare-stmt -> type identifier [initialize]
- type -> prim-type | prim-type [ sub ]
- sub -> number | ε
- prim-type -> int | double
- initialize -> = lvalue
- lvalue -> exp | { exps }
- exps -> exp exp-clos
- exp-clos -> , exp exp-clos | ε
- stmt-sequence -> statement stmt-sequence | ε
- statement -> if-stmt | while-stmt | assign-stmt ; | read-stmt ; | write-stmt ;
declare-stmt ; | return-stmt ; | call-stmt ; | for-stmt ; | ; - assign-stmt -> variable = assign-stmt | lvalue
- write-stmt -> print ( string | exp )
- read-stmt -> scan ( variable )
- call-stmt -> identifier ( arg-list )
- arg-list -> lvalue arg-list | ε
- return-stmt -> return exp
- if-stmt -> if ( exp ) if-block
- if-block -> stmt-block [else stmt-block]
- stmt-block -> statement | { stmt-sequence }
- while-stmt -> while ( exp ) stmt-block | do stmt-block while ( exp ) ;
- for-stmt -> for ( for-list ) stm-block
- for-list -> for-init ; condition ; change
- for-init -> declare-stmt | assign-stmt
- condition -> exp
- change -> identifier = exp
- exp -> log-expr | add-expr
- log-expr -> log-expr logical com-expr | com-expr
- com-expr -> com-expr compare jud-expr | jud-expr
- jud-expr -> jud-expr islog-exprqual add-expr | add-expr
- add-expr -> add-expr addative mul-expr | mul-expr
- mul-expr -> mul-expr multiple operand | operand
- operand -> ( add-expr ) | number | variable | unary operand | ( num-assign ) | call-stmt
- logical -> || | &&
- islog-exprqual -> != | ==
- compare -> > | < | >= | <=
- multiple -> * | / | %
- addative -> + | -
- unary -> ! | + | -
- 函数应支持先声明后定义的形式
- 参数列表以int,double以及数组为参数
- 参数列表中的数组下标可以为空或数字
- 参数列表为空时可以用(void)或者()表示
- if语句,支持级联形式
- while语句,支持do-while形式
- switch, break和continue暂时还未加入
- 声明数组时形式为type[] identifier, 暂不支持类似于int a[]的形式
- 数组赋值时支持表达式和变量形式,如int[] b = {a, 1+2}
- 暂定所有变量声明时都有默认初始值0
- 不支持将逗号作为运算符,如int a, b;以及a = b=2, c=3;等形式
- 支持逻辑表达式与算术表达式结果之间的转换(0代表true, 非0代表false,true代表1,flase代表0)