Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

表达式求解的通用思路. 写出LL(1)文法, 再用递归下降求解

Posted by tankadozmy at 2014-09-03 22:44:20 on Problem 2106
#include <cstdio> 
#include <cstdlib> 

using namespace std; 

/* 
 * LL(1) Grammar
 * expr			: sub expr_rest 
 *
 * expr_rest	: | sub expr_rest 
 * 				| ε
 *
 * sub 			: term sub_rest 
 *
 * sub_rest		: & term sub_rest 
 *				| ε
 *
 * term 		: ! term 
 * 				| atom
 *
 * atom 		: (expr) 
 * 				| V 
 * 				| F 
 * 
 * Pitfall: 
 * 		bool val = left_operand && term();  // lazy evaluation, or 
 * 		bool val = left_operand || sub(); 
 */ 

char lookahead = '$'; 

void match(char c) { 
	if (lookahead != c) { 
		// ERROR 
	}
	if (c == '\n') { 
		lookahead = '$'; 
		return; 
	}
	lookahead = getchar(); 
	while (lookahead == ' ') { 
		lookahead = getchar(); 
	}
}

bool expr(); 
bool expr_rest(bool left_operand); 
bool sub(); 
bool sub_rest(bool left_operand); 
bool term(); 
bool atom(); 

void line() { 
	if (expr()) { 
		printf("V\n"); 
	}
	else { 
		printf("F\n"); 
	}
	match('\n'); 
}

bool expr() { 
	bool left_operand = sub(); 
	return expr_rest(left_operand); 
}

bool expr_rest(bool left_operand) { 
	if (lookahead == '|') { 
		match('|'); 
		bool right_operand = sub(); 
		return expr_rest(left_operand || right_operand); 
	}
	else { 
		return left_operand; 
	}
}

bool sub() { 
	bool left_operand = term(); 
	return sub_rest(left_operand); 
}

bool sub_rest(bool left_operand) { 
	if (lookahead == '&') { 
		match('&'); 
		bool right_operand = term(); 
		return sub_rest(left_operand && right_operand); 
	}
	else { 
		return left_operand; 
	}
}

bool term() { 
	if (lookahead == '!') { 
		match('!');
		return !term(); 
	}
	else { 
		return atom(); 
	}
}

bool atom() { 
	if (lookahead == '(') { 
		match('('); 
		bool val = expr(); 
		match(')'); 
		return val; 
	}
	else if (lookahead == 'V') { 
		match('V'); 
		return true; 
	}
	else if (lookahead == 'F') { 
		match('F'); 
		return false; 
	}
	else { 
		printf("Symbol Error\n"); 
		exit(1); 
	}
}

int main() { 
	int t = 0; 
	while (1) { 
		lookahead = getchar(); 
		if (lookahead == EOF) { 
			break; 
		}
		printf("Expression %d: ", ++t); 
		line(); 
	}
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator