⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.mly

📁 用ocaml编写的pascal编译程序
💻 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 + -