编辑: 烂衣小孩 2016-03-13

0、出错恢复单词集合为句号、声明符或语句开始符.进入Block过程后,首先把局部数据段分配指针设为3,准备分配3个单元供运行期存放静态链SL、动态链DL 和返回地址RA.然后用Tx0记录下当前符号表位置并产生一条Jmp指令,准备跳转到主程序的开始位置,由于当前还没有知到主程序究竟在何处开始,所以Jmp的目标暂时填为0,稍后再改.同时在符号表的当前位置记录下这个Jmp指令在代码段中的位置.在判断了嵌套层数没有超过规定的层数后,开始分析源程序.首先判断是否遇到了常量声明,如果遇到则开始常量定义,把常量存入符号表.接下去用同样的方法分析变量声明,变量定义过程中会用Dx变量记录下局部数据段分配的空间个数.然后如果遇到Procedure保留字则进行过程声明和定义,声明的方法是把过程的名字和所在的层次记入符号表,过程定义的方法就是通过递归调用Block过程,因为每个过程都是一个分程序.由于这是分程序中的分程序,因此调用Block时需把当前的层次号Lev加一传递给Block 过程.分程序声明部分完成后,即将进入语句的处理,这时的代码分配指针CX的值正好指向语句的开始位置,这个位置正是前面的Jmp指令需要跳转到的位置.于是通过前面记录下来的地址值,把这个Jmp指令的跳转位置改成当前cx的位置.并在符号表中记录下当前的代码段分配地址和局部数据段要分配的大小(DX 的值).生成一条INT指令,分配DX个空间,作为这个分程序段的第一条指令.下面就调用语句处理过程Statement分析语句.分析完成后,生成操作数为0的OPR指令,用于从分程序返回(对于0层的主程序来说,就是程序运行完成,退出).

4、语句语法描述: 四 扩充功能的部分设计 1.添加标识符 typedef enum { NUL, IDENT, NUMBER, PLUS, MINUS, TIMES, SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ, LPAREN, RPAREN, COMMA, SEMICOLON, PERIOD, BECOMES, BEGINSYM, ENDSYM, IFSYM,THENSYM, WHILESYM, WRITESYM, READSYM, DOSYM, CALLSYM, CONSTSYM, VARSYM, PROCSYM, PROGSYM ,REPEATSYM, UNTILSYM,CHARSYM,REALSYM, /*增加ELSE,FOR,TO,DOWNTO的保留字*/ ELSESYM,FORSYM,TOSYM,DOWNTOSYM, /*增加+的标识符*/ PLUSEQ,MINUSEQ,PLUSPLUS,MINUSMINUS } SYMBOL;

2添加' else if(CH=在这里添加+=,++的标识,让+=,++合法 GetCh();

if(CH=='='){SYM=PLUSEQ;

GetCh(如果加号后面是=号就是PLUSEQ else if(CH=='+') {SYM=PLUSPLUS;

GetCh();

} //如果加号后面是+就是PLUSPLUS else SYM=PLUS;

//正常的+号}else if(CH=在这里添加-=,--,让--,-=合法 GetCh();

if(CH=='='){SYM=MINUSEQ;

GetCh();

}//如果减号后面是=就是MINUSEQ else if(CH=='-') {SYM=MINUSMINUS;

GetCh();

}//如果减号后面是-就是MINUSMINUS else SYM=MINUS;

//否则是正常的-号}else if(CH=SYM=GEQ;

GetCh( else { SYM=SSYM[CH];

GetCh();

} 3不等号处理 if (CH=='

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题