构造使用类C语言的脚本引擎(4)
作者 :kevin_qing
转贴请注明
同上一章一样,语法分析部分也不准备使用yacc直接生成代码,而是只使用yacc的生成的分析表。
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 LPAREN RPAREN CPD_SMT
;
CPD_SMT
: LBRACE SMT_SEQ RBRACE
;
SMT_SEQ
: LB_SMT
| SMT_SEQ LB_SMT
;
LABLE : ID COLON
;
LB_SMT
: SMT
| LABLE SMT
;
SMT
: EXPR SEMI
| SEMI
| GOTO ID SEMI
| RETURN SEMI
| IF LPAREN EXPR RPAREN SMT
| IF LPAREN EXPR RPAREN SMT ELSE SMT
| SWITCH LPAREN EXPR RPAREN LBRACE CASES RBRACE
| CPD_SMT
;
CASE : NUMBERS COLON SMT
;
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