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

📄 subprodure.cpp

📁 PL/0语言的词法分析
💻 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 + -