📄 subprodure.cpp
字号:
#include "subProdure.h"
#include <strstream>
using namespace std;
void error(char * msg){
if(0 != curSym.ln) cout<<" 行 "<<curSym.ln<<" ";
if(0 != curSym.col) cout<<" 列 "<<curSym.col<<" ";
cout<<msg<<endl;
exit(1);
}
void getSym(){
infile>>curSym.type;
infile.ignore();
infile>>curSym.id;
bool getln=false,getcol=false;
char tmp=infile.get();
while(tmp!='\n'){
switch(tmp){
case 'L':
if( 'n'==(tmp=infile.get()) ){
infile>>curSym.ln;
getln=true;
}
break;
case 'C':
if( 'o'==(tmp=infile.get()) && 'l'== (tmp=infile.get()) ){
infile>>curSym.col;
getcol=true;
}
break;
default:
tmp=infile.get();
}
}
if(!getln) curSym.ln=0;
if(!getcol) curSym.col=0;
//cout<<"Debug in getSym(), line "<<__LINE__<<" "<<curSym.id<<endl;
}
bool sp_program(void){
getSym();
sp_subprogram();
return true;
}
bool sp_subprogram(void){
int phase = 0;
while(phase<4){
switch(curSym.type){
case SYM_CONST: //1. const
getSym();
if( SYM_IDENTIFIER != curSym.type ){
error("Const 之后应为 表识符.");
}
getSym();
if( SYM_EQU != curSym.type ){
error("Const 语句的 表识符 没有使用 \"=\" 初始化.");
}
getSym();
if( SYM_NUMBER != curSym.type ){
error("Const 语句的 初始化 数据 缺失.");
}
getSym();
while( SYM_COMMA == curSym.type ){
getSym();
if( SYM_IDENTIFIER != curSym.type ){
error("Const 语句 表识符缺失.");
}
getSym();
if( SYM_EQU != curSym.type ){
error("Const 语句的 表识符 没有使用 \"=\" 初始化.");
}
getSym();
if( SYM_NUMBER != curSym.type ){
error("Const 语句的 初始化 数据 缺失.");
}
getSym();
}
if( SYM_SEMICOLON != curSym.type ){
error("Const 语句 缺失 \";\".");
}
getSym();
phase=1;
break;
case SYM_VAR: //2. var
getSym();
if( SYM_IDENTIFIER != curSym.type ){
error("Var 语句 表识符缺失.");
}
getSym();
while( SYM_COMMA == curSym.type ){
getSym();
if( SYM_IDENTIFIER != curSym.type ){
error("Var 语句 表识符缺失.");
}
getSym();
}
if( SYM_SEMICOLON != curSym.type ){
error("Var 语句 缺失 \";\".");
}
getSym();
phase=2;
break;
case SYM_PROCEDURE: //3. produre
getSym();
if( SYM_IDENTIFIER != curSym.type ){
error("Produre语句首部表识符缺失.");
}
getSym();
if( SYM_SEMICOLON != curSym.type ){
error("Produre语句首部缺失 \";\".");
}
getSym();
sp_subprogram();
if( SYM_SEMICOLON != curSym.type ){
error("Produre语句说明部分缺失 \";\".");
}
getSym();
phase=3;
break;
default: //4. sentence
sp_sentence();
phase=4;
}
}
return true;
}
bool sp_sentence(void){
switch(curSym.type){
case SYM_IDENTIFIER:
getSym();
if( SYM_BECOMES != curSym.type ){
error("期望 := 符号.");
}
getSym();
sp_expression();
break;
case SYM_CALL:
getSym();
if( SYM_IDENTIFIER != curSym.type ){
error("call 后缺少 标识符.");
}
getSym();
break;
case SYM_BEGIN:
getSym();
sp_sentence();
while(SYM_SEMICOLON == curSym.type ){
getSym();
sp_sentence();
}
if( SYM_END != curSym.type ) error("丢失 end .");
else{
getSym();
}
break;
case SYM_IF:
getSym();
sp_condition();
if( SYM_THEN != curSym.type ) error("丢失 then .");
getSym();
sp_sentence();
break;
case SYM_WHILE:
getSym();
sp_condition();
if( SYM_DO != curSym.type ) error("丢失 do .");
getSym();
sp_sentence();
break;
case SYM_READ:
getSym();
if( SYM_LPAREN != curSym.type ) error("read语句中丢失 \"(\" .");
getSym();
if( SYM_IDENTIFIER != curSym.type ) error("read语句中缺少 标识符.");
getSym();
while( SYM_COMMA == curSym.type ){
getSym();
if( SYM_IDENTIFIER != curSym.type ) error("read语句中缺少 标识符.");
getSym();
}
if( SYM_RPAREN != curSym.type ) error("read语句中丢失 \")\" .");
break;
case SYM_WRITE:
getSym();
if( SYM_LPAREN != curSym.type ) error("write语句中丢失 \"(\" .");
getSym();
if( SYM_IDENTIFIER != curSym.type ) error("write语句中缺少 标识符.");
getSym();
while( SYM_COMMA == curSym.type ){
getSym();
if( SYM_IDENTIFIER != curSym.type ) error("write语句中缺少 标识符.");
getSym();
}
if( SYM_RPAREN != curSym.type ) error("write语句中丢失 \")\" .");
break;
default:
if( SYM_END == curSym.type ){
error("End的前有多余的分号。");
}
error("非法的语句 起始.");
}
return true;
}
bool sp_condition(void){
if(SYM_ODD == curSym.type ){
getSym();
sp_expression();
}else{
sp_expression();
if(SYM_EQU == curSym.type || SYM_NEQ == curSym.type
|| SYM_LES == curSym.type || SYM_LEQ == curSym.type
|| SYM_GTR == curSym.type || SYM_GEQ == curSym.type ){
getSym();
sp_expression();
}else error("条件表达式出错(无关系云算符).");
}
return true;
}
bool sp_expression(void){
if(SYM_PLUS == curSym.type || SYM_MINUS == curSym.type) getSym();
sp_term();
while(SYM_PLUS == curSym.type || SYM_MINUS == curSym.type){
getSym();
sp_term();
}
return true;
}
bool sp_term(void){
sp_factor();
while( /* getSym(), */ SYM_TIMES == curSym.type || SYM_SLASH == curSym.type ){
getSym();
sp_factor();
}
return true;
}
bool sp_factor(void){
//getSym();
if(SYM_LPAREN == curSym.type){
getSym();
sp_term();
//getsym();
if(SYM_RPAREN == curSym.type){
getSym();
}else error("因子 缺少一右括号。");
}else if (SYM_IDENTIFIER == curSym.type || SYM_NUMBER == curSym.type ){
getSym();
}else error("不是以合法的因子。");
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -