tiny C 语法(对编译原理bnf熟悉的进)
目前做一tinyC编译器,不支持函数定义,但支持函数call,数学/比较/逻辑运算if-else/goto/switch语法
switch语法为
switch(exp){
1:
.....
2:
........
}
BNF如下:
%token ID IF ELSE SWITCH GOTO RETURN NUMBER STRING MAIN
%token ADD_OP MUL_OP ASSIGN_OP CMP_OP LOGIC_OP1 LOGIC_OP2
%token LPAREN RPAREN LBRACE RBRACE COLON COMMA SEMI
%%
PROG
: MAIN compound_statement
;
compound_statement
: LBRACE statement_sequence RBRACE
;
statement_sequence
: labled_statement
| statement_sequence labled_statement
;
LABLE : ID COLON
;
labled_statement
: statement
| LABLE statement
;
statement
: EXPR SEMI
| SEMI
| GOTO ID SEMI
| RETURN SEMI
| IF LPAREN EXPR RPAREN statement
| IF LPAREN EXPR RPAREN statement ELSE statement
| SWITCH LPAREN EXPR RPAREN LBRACE CASES RBRACE
| compound_statement
;
CASE : NUMBERS COLON statement
;
CASES : CASE
| CASES CASE
;
NUMBERS : ADD_OP NUMBER
| NUMBER
;
STRINGS : STRING
| STRINGS STRING
;
PAM_LIST
: EXPR
| PAM_LIST COMMA EXPR
;
PRI_EXPR
: ID
| NUMBERS
| STRINGS
| LPAREN EXPR RPAREN
;
POST_EXPR
: PRI_EXPR
| ID LPAREN RPAREN
| ID LPAREN PAM_LIST RPAREN
;
MUL_EXPR
: POST_EXPR
| MUL_EXPR MUL_OP POST_EXPR
;
ADD_EXPR
: MUL_EXPR
| ADD_EXPR ADD_OP MUL_EXPR
;
CMP_EXPR
: ADD_EXPR
| ADD_EXPR CMP_OP ADD_EXPR
;
LOGIC_EXPR
: CMP_EXPR
| LOGIC_EXPR LOGIC_OP2 CMP_EXPR
| LOGIC_OP1 CMP_EXPR
;
EXPR
: LOGIC_EXPR
| ID ASSIGN_OP EXPR
;
%%
帮忙看看bnf还有没有问题