📄 parser.mly
字号:
%{open Sem
%}
%token ADD SUB MUL DIV LEQ LES GRT GEQ EQL NEQ EOF
%token TRUE FALSE AND OR NOT MINUS
%token AFF LPA RPA LCOR RCOR VIRG PVIRG PT DPT
%token IF THEN ELSE WHILE DO BEGIN END
%token INTEGER BOOLEAN
%token ARRAY OF VAR PROC PROGRAM
%token <string> IDENT
%token <int> NUMBER
%left OR
%left AND
%nonassoc NOT
%nonassoc EQL NEQ LEQ LES GRT GEQ
%left ADD SUB
%left MUL DIV
%nonassoc MINUS
%start program
%type<Sem.s_program> program
%%
program:PROGRAM IDENT PVIRG block PT {($2,$4)};
cst:NUMBER {S_num($1)}
|TRUE {S_true}
|FALSE {S_false};
expr:expr ADD expr {S_bin(S_add,($1,sem_null),($3,sem_null))}
|expr SUB expr {S_bin(S_sub,($1,sem_null),($3,sem_null))}
|expr MUL expr {S_bin(S_mul,($1,sem_null),($3,sem_null))}
|expr DIV expr {S_bin(S_div,($1,sem_null),($3,sem_null))}
|expr LEQ expr {S_bin(S_leq,($1,sem_null),($3,sem_null))}
|expr LES expr {S_bin(S_les,($1,sem_null),($3,sem_null))}
|expr GRT expr {S_bin(S_grt,($1,sem_null),($3,sem_null))}
|expr GEQ expr {S_bin(S_geq,($1,sem_null),($3,sem_null))}
|expr EQL expr {S_bin(S_eq,($1,sem_null),($3,sem_null))}
|expr NEQ expr {S_bin(S_neq,($1,sem_null),($3,sem_null))}
|expr AND expr {S_bin(S_and,($1,sem_null),($3,sem_null))}
|expr OR expr {S_bin(S_or,($1,sem_null),($3,sem_null))}
|SUB expr %prec MINUS {S_una(S_minus,($2,sem_null))}
|NOT expr {S_una(S_not,($2,sem_null))}
|cst {S_cst($1)}
|deref {S_der($1)}
|LPA expr RPA {$2};
deref2: LCOR expr RCOR {Some($2,sem_null)}
| {None};
deref:IDENT deref2 {($1,sem_null),$2};
lexpr :
expr {[($1, sem_null)]}
|expr VIRG lexpr {($1, sem_null)::$3};
instr:
deref AFF expr {S_aff($1,($3,sem_null))}
|IDENT LPA lexpr RPA {S_cal(($1,sem_null),$3)}
|IF expr THEN instr ELSE instr {S_ite(($2,sem_null),$4,$6)}
|WHILE expr DO instr {S_whi(($2,sem_null),$4)}
|BEGIN linstr END {S_lst($2)};
linstr2: PVIRG instr linstr2 {$2::$3}
| {[]};
linstr: instr linstr2 {$1::$2}
| {[]};
btype: INTEGER {S_int}
|BOOLEAN {S_bool};
tdecl:btype {S_dbty($1)}
|ARRAY LCOR expr PT PT expr RCOR OF btype {S_darr(($3,sem_null),($6,sem_null),$9)};
vdecl2:VIRG IDENT vdecl2 {$2::$3}
| {[]};
vdecl:VAR IDENT vdecl2 DPT tdecl {($2,$5)};
tspec:btype {S_sbty($1)}
|ARRAY LCOR IDENT PT PT IDENT RCOR OF btype {S_sarr($3,$6,$9)};
pspec2:VAR {S_addr}
| {S_value};
pspec:pspec2 IDENT DPT tspec {($1,$2,$4)};
lpspec2: PVIRG pspec lpspec2 {$2::$3}
| {[]};
lpspec: pspec lpspec2 {$1::$2}
| {[]};
block2:vdecl PVIRG block2 {$1::$3}
| {[]};
block3:procd PVIRG block3 {$1::$3}
| {[]};
block:block2 block3 BEGIN linstr END {S_blk($1,$2,$4)};
procd:PROC IDENT LPA lpspec RPA PVIRG block {($2,$4,$7)};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -