亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? process.cpp

?? Full support for extended regular expressions (those with intersection and complement); Support for
?? CPP
?? 第 1 頁 / 共 3 頁
字號:

#include "dolphin.h"

#include <stdio.h>
#include <iostream>
#include <typeinfo>
using namespace std;

#include "assert.h"
#include "process.h"
#include "matrix.h"
#include "serialize.h"
#include "stl.h"
using namespace Whale;

//#define EXTRACT_FIRST_AND_LAST_TERMINAL_FUNCTIONS
//#define DEBUG_DERIVATION_PATHS_MATRIX
//#define PRINT_SERIALIZED_EXPRESSIONS

bool process_expression_proc(NonterminalExpression *expr, int nn, bool flag);
bool process_expression_proc(NonterminalExpressionS *expr, int nn, bool flag);
bool process_expression_proc(NonterminalExpressionC *expr, int nn);
bool check_whether_terminal_symbol_is_in_range(int tn, Terminal *location);
bool check_whether_terminal_symbol_is_in_range(vector<int> &v, Terminal *location);
bool decode_escape_sequences(char *s, vector<int> &v);
bool get_character_from_the_string_that_is_expected_to_be_exactly_one_character_long(NonterminalExpressionS *expr_s, int nn, int &result);

void print_a_number_of_terminal_locations(ostream &os, vector<Terminal *> &a, char *word)
{
	for(int k=0; k<a.size(); k++)
	{
		if(k) os << (k<a.size()-1 ? ", " : " and ");
		os << word << " ";
		print_terminal_location(os, a[k]);
	}
}

void print_derivation_path(ostream &os, PathData &path, int initial,
	PathData::TransitionType bracket_brace_threshold=PathData::IN_EXPRESSION)
{
	int n=path.v.size();
	os << data.nonterminals[initial].name;
	for(int i=0; i<n; i++)
	{
		os << " ";
		os << (path.v[i].second<=bracket_brace_threshold ? "[" : "{");
		print_terminal_location(os, path.v[i].first);
		os << (path.v[i].second<=bracket_brace_threshold ? "]" : "}");
		os << " " << path.v[i].first->text;
	}
}

void print_a_number_of_expressions(ostream &os, set<int> &expressions)
{
	int pos=0;
	for(set<int>::iterator p=expressions.begin(); p!=expressions.end(); p++)
	{
		if(pos)
		{
			if(pos<expressions.size()-1)
				os << ", ";
			else
				os << " and ";
		}
		pos++;

		os << data.recognized_expressions[*p].in_serialized_form;
	}
}

void print_a_number_of_start_conditions(ostream &os, set<int> &start_conditions)
{
	int pos=0;
	for(set<int>::iterator p=start_conditions.begin(); p!=start_conditions.end(); p++)
	{
		if(pos)
		{
			if(pos<start_conditions.size()-1)
				os << ", ";
			else
				os << " and ";
		}
		pos++;
		
		os << data.start_conditions[*p].name;
	}
}

#ifdef EXTRACT_FIRST_AND_LAST_TERMINAL_FUNCTIONS
Terminal *extract_first_terminal(Symbol *s)
{
	vector<Terminal *> v;
	s->extract_terminals(v);
	if(v.size())
		return v[0];
	else
		return NULL;
}

Terminal *extract_last_terminal(Symbol *s)
{
	vector<Terminal *> v;
	s->extract_terminals(v);
	if(v.size())
		return v[v.size()-1];
	else
		return NULL;
}
#endif

void print_derivation_paths()
{
	int n=data.nonterminals.size();
	for(int i=0; i<n; i++)
		for(int j=0; j<n; j++)
		{
			PathData &m_ij=data.derivation_paths[i][j];
			if(m_ij.v.size())
			{
				cout << "m[" << i << "][" << j << "] (" << m_ij.worst << ") = ";
				print_derivation_path(cout, m_ij, i);
				cout << "\n";
			}
		}
}

// expr points to a tree containing a subexpression.
// nn is the number of nonterminal in the left side of the rule that contains
// expr as a subexpression. If we are processing an expression that belongs to
//   a recognized expression, not a grammar rule, than nn==-1.
// flag==true means that a rightmost recursion may take place through this
//   subexpression.
// returns true if no errors were found, false otherwise.
bool process_expression_proc(NonterminalExpression *expr, int nn, bool flag)
{
	if(typeid(*expr)==typeid(NonterminalExpressionDisjunction))
	{
		NonterminalExpressionDisjunction &expr_d=*dynamic_cast<NonterminalExpressionDisjunction *>(expr);
		bool result1=process_expression_proc(expr_d.expr1, nn, flag);
		bool result2=process_expression_proc(expr_d.expr2, nn, flag);
		return result1 && result2;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionConjunction))
	{
		NonterminalExpressionConjunction &expr_c=*dynamic_cast<NonterminalExpressionConjunction *>(expr);
		bool result1=process_expression_proc(expr_c.expr1, nn, false);
		bool result2=process_expression_proc(expr_c.expr2, nn, false);
		return result1 && result2;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionConcatenation))
	{
		NonterminalExpressionConcatenation &expr_cat=*dynamic_cast<NonterminalExpressionConcatenation *>(expr);
		bool result1=process_expression_proc(expr_cat.expr1, nn, false);
		bool result2=process_expression_proc(expr_cat.expr2, nn, flag);
		if(nn>=0)
			data.nonterminals[nn].can_be_used_in_IN_expressions=false;
		return result1 && result2;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionComplement))
	{
		NonterminalExpressionComplement &expr_com=*dynamic_cast<NonterminalExpressionComplement *>(expr);
		bool result=process_expression_proc(expr_com.expr, nn, false);
		if(nn>=0)
			data.nonterminals[nn].can_be_used_in_IN_expressions=false;
		return result;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionOmittable))
	{
		NonterminalExpressionOmittable &expr_om=*dynamic_cast<NonterminalExpressionOmittable *>(expr);
		bool result=process_expression_proc(expr_om.expr, nn, flag);
		if(nn>=0)
			data.nonterminals[nn].can_be_used_in_IN_expressions=false;
		return result;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionInParentheses))
	{
		NonterminalExpressionInParentheses &expr_p=*dynamic_cast<NonterminalExpressionInParentheses *>(expr);
		bool result=process_expression_proc(expr_p.expr, nn, flag);
		return result;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionIteration))
	{
		NonterminalExpressionIteration &expr_it=*dynamic_cast<NonterminalExpressionIteration *>(expr);
		bool result=process_expression_proc(expr_it.expr, nn, false);
		if(nn>=0)
			data.nonterminals[nn].can_be_used_in_IN_expressions=false;
		if(!strcmp(expr_it.sign->text, "*"))
			expr_it.reflexive=true;
		else if(!strcmp(expr_it.sign->text, "+"))
			expr_it.reflexive=false;
		else
			assert(false);
		return result;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionCondition))
	{
		NonterminalExpressionCondition &expr_c=*dynamic_cast<NonterminalExpressionCondition *>(expr);
		bool result=process_expression_proc(expr_c.condition, nn);
		return result;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionRange))
	{
		NonterminalExpressionRange &expr_r=*dynamic_cast<NonterminalExpressionRange *>(expr);
		bool result1=get_character_from_the_string_that_is_expected_to_be_exactly_one_character_long(expr_r.first_expr, nn, expr_r.first);
		bool result2=get_character_from_the_string_that_is_expected_to_be_exactly_one_character_long(expr_r.last_expr, nn, expr_r.last);
		if(result1 && result2)
		{
			if(expr_r.first>expr_r.last)
			{
				cout << "Invalid 'range' expression at ";
				print_terminal_location(cout, expr_r.range_kw);
				cout << ": symbol at ";
				print_terminal_location(cout, expr_r.first_expr->symbol);
				cout << " is greater than symbol at ";
				print_terminal_location(cout, expr_r.last_expr->symbol);
				cout << ".\n";
				return false;
			}
			else
			{
			//	***** REMOVE IT: *****
			//	for(int j=expr_r.first; j<=expr_r.last; j++)
			//		data.charset.new_symbol(j);
				
				return true;
			}
		}
		else
			return false;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionContains))
	{
		NonterminalExpressionContains &expr_c=*dynamic_cast<NonterminalExpressionContains *>(expr);
		bool result=process_expression_proc(expr_c.expr, nn, false);
		if(nn>=0)
			data.nonterminals[nn].can_be_used_in_IN_expressions=false;
		return result;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionEpsilon))
	{
//		NonterminalExpressionEpsilon &expr_eps=*dynamic_cast<NonterminalExpressionEpsilon *>(expr);
		if(nn>=0)
			data.nonterminals[nn].can_be_used_in_IN_expressions=false;
		return true;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionSharpSign))
		return true;
	else if(typeid(*expr)==typeid(NonterminalExpressionSymbol))
	{
		NonterminalExpressionSymbol &expr_s=*dynamic_cast<NonterminalExpressionSymbol *>(expr);
		bool result=process_expression_proc(expr_s.expr, nn, flag);
		return result;
	}
	else
	{
		assert(false);
		return false; // to please the compiler
	}
}

bool process_expression_proc(NonterminalExpressionS *expr_s, int nn, bool flag)
{
	Terminal *t=expr_s->symbol;
	char *s=t->text;
	if(typeid(*t)==typeid(TerminalId))
	{
		int nn2=data.find_nonterminal(s);
		expr_s->is_nts=true;
		expr_s->nn=nn2;
		if(nn2==-1)
		{
			cout << "Reference to undefined nonterminal '" << s << "' at ";
			print_terminal_location(cout, t);
			cout << ".\n";
			return false;
		}
		
		if(nn>=0)
		{
			PathData &path=data.derivation_paths[nn][nn2];
			if(!path.v.size())
			{
			#ifdef DEBUG_DERIVATION_PATHS_MATRIX
				cout << "creating\n";
			#endif
				path.worst=(flag ? PathData::RIGHT : PathData::NORMAL);
				path.v.push_back(make_pair(t, path.worst));
			}
			else if(path.v.size() && path.worst==PathData::RIGHT && !flag)
			{
			#ifdef DEBUG_DERIVATION_PATHS_MATRIX
				cout << "replacing\n";
			#endif
				path.v.clear();
				path.worst=PathData::NORMAL;
				path.v.push_back(make_pair(t, path.worst));
			}
		#ifdef DEBUG_DERIVATION_PATHS_MATRIX
			else
				cout << "ignoring\n";
		#endif
		}
		
		return true;
	}
	else if(typeid(*t)==typeid(TerminalString))
	{
		expr_s->is_nts=false;
		bool result=decode_escape_sequences(s, expr_s->s);
		if(!result)
		{
			cout << "Ill-formed escape sequences in string at ";
			print_terminal_location(cout, t);
			cout << ".\n";
		}
		else
		{
			if(nn>=0)
			{
				if(expr_s->s.size()!=1)
					data.nonterminals[nn].can_be_used_in_IN_expressions=false;
			}
		}
		result=(check_whether_terminal_symbol_is_in_range(expr_s->s, t) && result);
		return result;
	}
	else if(typeid(*t)==typeid(TerminalNumber))
	{
		int tn=atoi(s);
		
		expr_s->is_nts=false;
		expr_s->s.push_back(tn);
		
		return check_whether_terminal_symbol_is_in_range(tn, t);
	}
	else if(typeid(*t)==typeid(TerminalHexNumber))
	{
		assert(s[0]=='0' && tolower(s[1])=='x' && s[2]);
		int tn;
		sscanf(s+2, "%x", &tn);
		
		expr_s->is_nts=false;
		expr_s->s.push_back(tn);
		
		return check_whether_terminal_symbol_is_in_range(tn, t);
	}
	else
	{
		assert(false);
		return false; // to please the compiler
	}
}

bool process_expression_proc(NonterminalExpressionC *expr, int nn)
{
	if(typeid(*expr)==typeid(NonterminalExpressionC_Disjunction))
	{
		NonterminalExpressionC_Disjunction &expr_d=*dynamic_cast<NonterminalExpressionC_Disjunction *>(expr);
		bool result1=process_expression_proc(expr_d.expr1, nn);
		bool result2=process_expression_proc(expr_d.expr2, nn);
		return result1 && result2;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionC_Conjunction))
	{
		NonterminalExpressionC_Conjunction &expr_c=*dynamic_cast<NonterminalExpressionC_Conjunction *>(expr);
		bool result1=process_expression_proc(expr_c.expr1, nn);
		bool result2=process_expression_proc(expr_c.expr2, nn);
		return result1 && result2;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionC_Complement))
	{
		NonterminalExpressionC_Complement &expr_com=*dynamic_cast<NonterminalExpressionC_Complement *>(expr);
		bool result=process_expression_proc(expr_com.expr, nn);
		return result;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionC_InParentheses))
	{
		NonterminalExpressionC_InParentheses &expr_p=*dynamic_cast<NonterminalExpressionC_InParentheses *>(expr);
		bool result=process_expression_proc(expr_p.expr, nn);
		return result;
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionC_Comparison))
	{
		NonterminalExpressionC_Comparison &expr_cmp=*dynamic_cast<NonterminalExpressionC_Comparison *>(expr);
		
		NonterminalExpressionS &left_symbol=*dynamic_cast<NonterminalExpressionS *>(expr_cmp.left);
		Terminal *left_location=left_symbol.symbol;
		bool left_is_c=!strcmp(left_location->text, "c");
		
		NonterminalExpressionS &right_symbol=*dynamic_cast<NonterminalExpressionS *>(expr_cmp.right);
		Terminal *right_location=right_symbol.symbol;
		bool right_is_c=!strcmp(right_location->text, "c");
		
		if(left_is_c && right_is_c)
		{
			cout << "Expressions at ";
			print_terminal_location(cout, left_location);
			cout << " and at ";
			print_terminal_location(cout, right_location);
			cout << " cannot both be 'c'.\n";
			return false;
		}
		else if(!left_is_c && !right_is_c)
		{
			cout << "Either the expression at ";
			print_terminal_location(cout, left_location);
			cout << ", or the expression at ";
			print_terminal_location(cout, right_location);
			cout << " should be 'c'.\n";
			return false;
		}
		
		if(!strcmp(expr_cmp.comparison_operator->text, "=="))
			expr_cmp.actual_operation=NonterminalExpressionC_Comparison::EQ;
		else if(!strcmp(expr_cmp.comparison_operator->text, "!="))
			expr_cmp.actual_operation=NonterminalExpressionC_Comparison::NE;
		else if(!strcmp(expr_cmp.comparison_operator->text, "<"))
			expr_cmp.actual_operation=NonterminalExpressionC_Comparison::LT;
		else if(!strcmp(expr_cmp.comparison_operator->text, "<="))
			expr_cmp.actual_operation=NonterminalExpressionC_Comparison::LE;
		else if(!strcmp(expr_cmp.comparison_operator->text, ">"))
			expr_cmp.actual_operation=NonterminalExpressionC_Comparison::GT;
		else if(!strcmp(expr_cmp.comparison_operator->text, ">="))
			expr_cmp.actual_operation=NonterminalExpressionC_Comparison::GE;
		else
			assert(false);
		
		if(left_is_c)
			return get_character_from_the_string_that_is_expected_to_be_exactly_one_character_long(&right_symbol, nn, expr_cmp.symbol);
		else if(right_is_c)
		{
			expr_cmp.actual_operation=NonterminalExpressionC_Comparison::swap_operands(expr_cmp.actual_operation);
			return get_character_from_the_string_that_is_expected_to_be_exactly_one_character_long(&left_symbol, nn, expr_cmp.symbol);
		}
		else
		{
			assert(false);
			return false;
		}
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionC_In))
	{
		NonterminalExpressionC_In &expr_in=*dynamic_cast<NonterminalExpressionC_In *>(expr);
		if(strcmp(expr_in.c->symbol->text, "c"))
		{
			cout << "Expecting 'c' at ";
			print_terminal_location(cout, expr_in.c->symbol);
			cout << ".\n";
			return false;
		}
		expr_in.nn=data.find_nonterminal(expr_in.symbol->text);
		if(expr_in.nn==-1)
		{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产91丝袜在线18| 日韩精品成人一区二区在线| 欧美日韩一区二区三区免费看| 国产精品一区二区三区99| 美国毛片一区二区三区| 亚洲va韩国va欧美va| 五月婷婷综合在线| 午夜精品久久久久久| 日韩电影在线看| 蜜桃视频免费观看一区| 激情小说欧美图片| 国产美女一区二区| 成人午夜视频免费看| 99国产欧美久久久精品| 欧美三级电影精品| 91精品国产色综合久久ai换脸| 欧美成人艳星乳罩| 国产欧美va欧美不卡在线| 国产精品青草综合久久久久99| 亚洲伦理在线精品| 日韩专区在线视频| 国产91精品一区二区麻豆网站| 成人av在线一区二区| 色老综合老女人久久久| 欧美精品少妇一区二区三区| 精品国产在天天线2019| 亚洲欧美日韩久久| 日韩高清中文字幕一区| 成人性生交大片免费看中文网站| 色婷婷av一区二区三区之一色屋| 欧美疯狂做受xxxx富婆| 欧美高清在线视频| 日日摸夜夜添夜夜添国产精品 | 久久久亚洲精品石原莉奈| 中文欧美字幕免费| 五月婷婷综合激情| 成人免费视频caoporn| 欧美日韩一区不卡| 国产精品久久午夜夜伦鲁鲁| 日韩电影在线一区| 色噜噜狠狠色综合中国| 国产亚洲欧美日韩在线一区| 夜夜揉揉日日人人青青一国产精品| 久久精品国产免费看久久精品| 99国内精品久久| 欧美不卡视频一区| 一区二区三区四区乱视频| 国产乱一区二区| 日韩一区二区精品在线观看| 日韩美女啊v在线免费观看| 另类的小说在线视频另类成人小视频在线| 成人精品视频一区二区三区 | 国产精品乱码一区二区三区软件 | 日韩精品专区在线| 亚洲精品乱码久久久久| 国产一区二区在线视频| 欧美日韩不卡一区二区| 亚洲一区在线播放| 91在线云播放| 国产精品美女www爽爽爽| 国产九色精品成人porny| 91精品国产综合久久婷婷香蕉| 亚洲丝袜精品丝袜在线| 成人午夜精品在线| www国产亚洲精品久久麻豆| 亚洲国产aⅴ天堂久久| 日本乱人伦aⅴ精品| 亚洲婷婷在线视频| 岛国一区二区在线观看| 久久久电影一区二区三区| 美女视频网站黄色亚洲| 欧美一区二区三区喷汁尤物| 丝袜亚洲另类欧美| 色呦呦国产精品| 亚洲午夜久久久久久久久电影院| 色哦色哦哦色天天综合| 亚洲欧美成人一区二区三区| 91久久一区二区| 亚洲综合999| 欧美精品第1页| 蜜臀久久久99精品久久久久久| 欧美一区二区高清| 麻豆国产精品视频| 久久久久久久久久看片| 成人激情综合网站| 自拍偷拍亚洲欧美日韩| 欧洲色大大久久| 天堂在线一区二区| 欧美成人一区二区三区| 国产精品系列在线播放| 亚洲视频免费看| 欧美艳星brazzers| 日本免费新一区视频| 久久久精品综合| 不卡的电影网站| 亚洲午夜视频在线观看| 精品欧美乱码久久久久久| 国产高清无密码一区二区三区| 中文字幕在线观看不卡| 91成人免费网站| 免费观看日韩电影| 日本一区二区不卡视频| 欧美日韩亚洲另类| 国产精品一二三区在线| 亚洲曰韩产成在线| 欧美电视剧在线观看完整版| 成人性生交大合| 日韩电影在线免费看| 中文字幕欧美三区| 欧美少妇性性性| 国产成人在线看| 日韩综合在线视频| 国产精品久久久久aaaa| 欧美一区二区三区小说| 成人av资源在线观看| 免费不卡在线视频| 亚洲免费观看高清| 久久伊99综合婷婷久久伊| 在线免费亚洲电影| 国产在线不卡一区| 五月婷婷综合激情| 伊人一区二区三区| 欧美国产成人精品| 日韩精品一区二区三区蜜臀| 欧美吻胸吃奶大尺度电影| 国产成人精品免费看| 日韩av网站免费在线| 亚洲欧美另类综合偷拍| 国产日韩欧美综合一区| 日韩天堂在线观看| 欧美日韩国产乱码电影| 91久久精品一区二区三区| 成人黄动漫网站免费app| 国产一区二区精品久久| 青青草精品视频| 亚洲韩国一区二区三区| 日韩毛片一二三区| 国产欧美视频在线观看| 精品99999| 精品国产网站在线观看| 日韩欧美在线影院| 欧美精品tushy高清| 欧美剧情电影在线观看完整版免费励志电影| 成人avav在线| 懂色av一区二区三区免费观看| 国产一区二区三区不卡在线观看 | 日本精品视频一区二区| 99久精品国产| 色综合天天综合网天天看片| 成人涩涩免费视频| 成人黄色在线看| 99免费精品在线观看| kk眼镜猥琐国模调教系列一区二区| 国产成人午夜电影网| 福利一区二区在线观看| 国产成人午夜99999| 国产精品一区免费在线观看| 国产综合久久久久久鬼色| 国产一区二区看久久| 粉嫩av一区二区三区粉嫩| 不卡一区中文字幕| 91免费视频网| 欧美日韩国产精品成人| 欧美一区二区三区公司| 亚洲精品在线免费观看视频| 国产亚洲综合在线| 中文在线一区二区| 亚洲精品第1页| 日韩福利电影在线| 国产一区二区三区在线观看免费| 国产成人在线影院| 91蜜桃在线免费视频| 欧美日韩午夜在线| 精品999久久久| 综合在线观看色| 日韩国产高清影视| 成人免费观看av| 欧美日韩电影一区| 久久只精品国产| 亚洲欧美电影院| 另类欧美日韩国产在线| 99re成人在线| 日韩一区二区三区高清免费看看| 国产日韩精品一区| 五月天久久比比资源色| 国产一区二区导航在线播放| 91麻豆自制传媒国产之光| 欧美日韩日日骚| 中文字幕精品综合| 水蜜桃久久夜色精品一区的特点| 精品在线观看免费| 色欧美乱欧美15图片| 精品嫩草影院久久| 亚洲成年人影院| 成人激情综合网站| 2欧美一区二区三区在线观看视频| 亚洲欧美日韩国产一区二区三区 | 国产精品传媒入口麻豆| 日韩电影在线观看电影| 91九色最新地址|