1. 程式人生 > >【編譯原理】語法分析

【編譯原理】語法分析

#include<iostream>
#include<string>
using namespace std;


#define RSB 0 //Right square bracket  右方括號
#define VT  1 //非終結符 
#define RB  2 //Right bracket 右括號
#define EQUAL 3//=號
/*
L → AL'
L'→ ||AL' | ε
A → BA'
A' → &&BA' | ε
B → !R | R
R → ER' | [L]
R' → >R'' | <R'' | ==E | !=E | ε
R'' → =E | E
E → TE'
E' → +TE'|ε
T → FT'
T' → *FT'|ε
F → (E) | i 
*/

void L();
void Lp();
void A();
void Ap();
void B();
void R();
void Rp();
void Rpp();
void E();
void E();
void Ep();
void T();
void Tp();
void F();
void D(string s);
void D(char now,string fun);

string s;
int i = 0;


int main(){
	while(1){
		cin>>s;
		s += '#';
		i = 0;
		try{
			L();
		}
		catch(int e){
			cout<<"在("<<i+1<<")"<<s[i]<<"處停止。"<<endl;
			switch(e){
			case RSB:
				cout<<"沒有找到右方括號]。"<<endl;
				continue;
			case VT:
				cout<<"沒有匹配到非終結符i。"<<endl;
				continue;
			case RB:
				cout<<"沒有找到右括號)。"<<endl;
				continue;
			case EQUAL:
				cout<<"沒有找到等號=。"<<endl;
				continue;
			default:
				break;
			};
		}
		if(i<s.length() &&  s[i] == '#')cout<<"匹配成功!"<<endl;
		else{
			cout<<"匹配不成功!"<<endl;
			cout<<"在("<<i+1<<")"<<s[i]<<"處停止。"<<endl;
		}
	}
	return 0;
}


void D(string s){
	cout<<s<<endl;
}

void D(char now,string fun){
	cout<<now<<' '<<fun<<endl;
}

void L(){
	A();
	Lp();
}

void Lp(){
	if(s[i] == '|' && s[i+1] == '|'){
		i += 2;
		A();
		Lp();
		return;
	}
}


void A(){
	B();
	Ap();
}

void Ap(){
	if(s[i] == '&' && s[i+1] == '&'){
		i += 2;
		B();
		Ap();
	}
}

void B(){
	if(s[i] == '!'){
		++i;
	}
	R();
}

void R(){
	if(s[i] == '['){
		++i;
		L();
		if(s[i] == ']'){
			++i;
			return;
		}
		else{
			throw RSB;//右方括號
		}
	}
	E();
	Rp();
}

void Rp(){
	switch(s[i]){
	case '>':
	case '<':
		++i;
		Rpp();
		return;
	case '=':
	case '!':
		++i;
		if( s[i] == '='){
			++i;
		}
		else{
			throw EQUAL;
		}
		E();
		return;
	default:
		return;
	};
}
void Rpp(){
	if(s[i] == '='){
		++i;
	}
	E();
}

void E(){
	T();
	Ep();
}
void Ep(){
	if(s[i] == '+'){
		++i;
		T();
		Ep();
	}

}
void T(){
	F();
	Tp();
}
void Tp(){
	if(s[i] == '*'){
		++i;
		F();
		Tp();
	}

}
void F(){
	switch(s[i]){
	case '(':
		++i;
		E();
		if(s[i] == ')'){
			++i;
		}
		else{
			throw RB;//沒有匹配到右括號
		}
		break;
	case 'i':
		++i;
		break;
	default:
		//D("沒有匹配到F");
		throw VT;//沒有匹配到非終結符i 或 (
	};
}