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

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

?? nfa.cpp

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

#include "dolphin.h"
#include "nfa.h"
#include <fstream>
#include <stdio.h>
using namespace std;
using namespace Whale;

#include "nfa-to-dfa.h"
#include "stl.h"
#include "time.h"

//#define DEBUG_EXPANDED
//#define DEBUG_CONJUNCTION
//#define DEBUG_COMPLEMENT
//#define DEBUG_DISJUNCTION
//#define DEBUG_CONCATENATION
//#define DEBUG_OMITTABLE
//#define DEBUG_ITERATION
//#define DEBUG_CONDITION
//#define DEBUG_RANGE
//#define DEBUG_CONTAINS
//#define DEBUG_EPSILON
//#define DEBUG_NONTERMINAL_SYMBOL
//#define DEBUG_TERMINAL_SYMBOL

//#define PRINT_WHERE_EXPRESSIONS_ARE_RECOGNIZED

/* Some explanation is required. The function constructs an NFA for          */
/* subexpression expr and adds it to the main NFA. Main NFA states           */
/* local_initial_state and local_final_state, which numbers are passed from  */
/* above as formal parameters, are used by the function as the initial and   */
/* the final state of the sub-NFA being created.                             */
/* recursive_path stores initial state numbers for each nonterminal in the   */
/* recursive path. Each recursive use of the nonterminal shall produce an    */
/* epsilon transition to the corresponding initial state.                    */
void construct_nfa_proc(NFA &nfa, Whale::NonterminalExpression *expr,
	int local_initial_state, int local_final_state,
	map<int, int> &recursive_path)
{
	if(expr->expanded)
	{
	#ifdef DEBUG_EXPANDED
		cout << "expanded " << typeid(*expr).name() << " (from " << local_initial_state << " to "
			<< local_final_state << "): " << expr->expanded << "\n";
	#endif
		set<int> actual_symbols=set<int>(*expr->expanded & UnionOfIntervals<int>(0, data.variables.alphabet_cardinality-1));
		
		for(set<int>::const_iterator p=actual_symbols.begin(); p!=actual_symbols.end(); p++)
			nfa.add_transition(local_initial_state, local_final_state, *p);
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionDisjunction))
	{
		NonterminalExpressionDisjunction &expr_d=*dynamic_cast<NonterminalExpressionDisjunction *>(expr);
	#ifdef DEBUG_DISJUNCTION
		cout << "disjunction: from " << local_initial_state << " to " << local_final_state << "\n";
	#endif
		construct_nfa_proc(nfa, expr_d.expr1, local_initial_state,
			local_final_state, recursive_path);
		construct_nfa_proc(nfa, expr_d.expr2, local_initial_state,
			local_final_state, recursive_path);
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionConjunction))
	{
		NonterminalExpressionConjunction &expr_c=*dynamic_cast<NonterminalExpressionConjunction *>(expr);
		
	#ifdef DEBUG_CONJUNCTION
		cout << "construct_nfa_proc(): processing conjunction.\n";
	#endif
		
		NFA nfa_for_expr1(nfa.number_of_symbols);
		int nfa1_initial_state=nfa_for_expr1.add_state();
		int nfa1_final_state=nfa_for_expr1.add_state();
		map<int, int> nfa1_recursive_path;
		construct_nfa_proc(nfa_for_expr1, expr_c.expr1,
			nfa1_initial_state, nfa1_final_state, nfa1_recursive_path);
		nfa_for_expr1.mark_as_accepting(nfa1_final_state);
		assert(!nfa1_recursive_path.size());
		
		NFA nfa_for_expr2(nfa.number_of_symbols);
		int nfa2_initial_state=nfa_for_expr2.add_state();
		int nfa2_final_state=nfa_for_expr2.add_state();
		map<int, int> nfa2_recursive_path;
		construct_nfa_proc(nfa_for_expr2, expr_c.expr2,
			nfa2_initial_state, nfa2_final_state, nfa2_recursive_path);
		nfa_for_expr2.mark_as_accepting(nfa2_final_state);
		assert(!nfa2_recursive_path.size());
		
	#ifdef DEBUG_CONJUNCTION
		cout << "construct_nfa_proc(): made two nfas ("
			<< nfa_for_expr1.states.size() << " and "
			<< nfa_for_expr2.states.size() << " states), converting them to dfas\n";
		print_nfa(nfa_for_expr1);
		print_nfa(nfa_for_expr2);
	#endif
		
		DFA dfa_for_expr1;
		convert_nfa_to_dfa(nfa_for_expr1, dfa_for_expr1);
		
		DFA dfa_for_expr2;
		convert_nfa_to_dfa(nfa_for_expr2, dfa_for_expr2);
		
	#ifdef DEBUG_CONJUNCTION
		cout << "construct_nfa_proc(): made two dfas ("
			<< dfa_for_expr1.states.size() << " and "
			<< dfa_for_expr2.states.size() << " states), now adding them to the main nfa.\n";
		print_dfa(dfa_for_expr1);
		print_dfa(dfa_for_expr2);
	#endif
		
//		int dfa1_size=dfa_for_expr1.states.size();
//		int dfa2_size=dfa_for_expr2.states.size();
		
		map<pair<int, int>, int> state_mapping;
		set<pair<int, int> > left_to_process;
		
		int our_initial_state=nfa.add_state();
		nfa.add_epsilon_transition(local_initial_state, our_initial_state);
		state_mapping[make_pair(0, 0)]=our_initial_state;
		left_to_process.insert(make_pair(0, 0));
		
		while(left_to_process.size())
		{
			pair<int, int> state_pair=*left_to_process.begin();
			int nfa_state_corresponding_to_this_state_pair=state_mapping[state_pair];
		#ifdef DEBUG_CONJUNCTION
			cout << "processing " << state_pair.first << ", " << state_pair.second << "\n";
		#endif
			
			DFA::State &dfa1_state=dfa_for_expr1.states[state_pair.first];
			DFA::State &dfa2_state=dfa_for_expr2.states[state_pair.second];
			
			for(int j=0; j<nfa.number_of_symbols; j++)
			{
				int target1=dfa1_state.transitions[j];
				int target2=dfa2_state.transitions[j];
				if(target1!=-1 && target2!=-1)
				{
					// target state is (target1, target2)
					map<pair<int, int>, int>::iterator p_target=state_mapping.find(make_pair(target1, target2));
					if(p_target!=state_mapping.end())
						nfa.add_transition(nfa_state_corresponding_to_this_state_pair, (*p_target).second, j);
					else
					{
						int new_nfa_state=nfa.add_state();
						state_mapping[make_pair(target1, target2)]=new_nfa_state;
						left_to_process.insert(make_pair(target1, target2));
						nfa.add_transition(nfa_state_corresponding_to_this_state_pair, new_nfa_state, j);
					}
				}
			}
			
			if(dfa1_state.is_accepting && dfa2_state.is_accepting)
				nfa.add_epsilon_transition(nfa_state_corresponding_to_this_state_pair, local_final_state);
			
			left_to_process.erase(state_pair);
		}
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionConcatenation))
	{
		NonterminalExpressionConcatenation &expr_cat=*dynamic_cast<NonterminalExpressionConcatenation *>(expr);
		int state_in_the_middle=nfa.add_state();
	#ifdef DEBUG_CONCATENATION
		cout << "concatenation: " << local_initial_state << " -> " << state_in_the_middle << " -> " << local_final_state << "\n";
	#endif
		construct_nfa_proc(nfa, expr_cat.expr1, local_initial_state,
			state_in_the_middle, recursive_path);
		construct_nfa_proc(nfa, expr_cat.expr2, state_in_the_middle,
			local_final_state, recursive_path);
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionComplement))
	{
		NonterminalExpressionComplement &expr_com=*dynamic_cast<NonterminalExpressionComplement *>(expr);
		
	#ifdef DEBUG_COMPLEMENT
		cout << "construct_nfa_proc(): processing complement.\n";
	#endif
		
		NFA nfa_for_expr(nfa.number_of_symbols);
		int nfa2_initial_state=nfa_for_expr.add_state();
		int nfa2_final_state=nfa_for_expr.add_state();
		map<int, int> nfa2_recursive_path;
		construct_nfa_proc(nfa_for_expr, expr_com.expr,
			nfa2_initial_state, nfa2_final_state, nfa2_recursive_path);
		nfa_for_expr.mark_as_accepting(nfa2_final_state);
		assert(!nfa2_recursive_path.size());
		
	#ifdef DEBUG_COMPLEMENT
		cout << "construct_nfa_proc(): made an nfa (" << nfa_for_expr.states.size() << " states), converting it to dfa\n";
		print_nfa(nfa_for_expr);
	#endif
		
		DFA dfa_for_expr;
		convert_nfa_to_dfa(nfa_for_expr, dfa_for_expr);
		
	#ifdef DEBUG_COMPLEMENT
		cout << "construct_nfa_proc(): made a dfa (" << dfa_for_expr.states.size() << " states), now adding it to the main nfa.\n";
		print_dfa(dfa_for_expr);
	#endif
		
		vector<int> state_mapping; // 'dfa_for_expr' -> 'nfa'.
		for(int i=0; i<dfa_for_expr.states.size(); i++)
			state_mapping.push_back(nfa.add_state());
		nfa.add_epsilon_transition(local_initial_state, state_mapping[0]);
		
		int omniaccepting_state=nfa.add_state();
	#ifdef DEBUG_COMPLEMENT
		cout << "omniaccepting state: " << omniaccepting_state << "\n";
	#endif
		for(int j=0; j<dfa_for_expr.number_of_symbols; j++)
			nfa.add_transition(omniaccepting_state, omniaccepting_state, j);
		nfa.add_epsilon_transition(omniaccepting_state, local_final_state);
		
		for(int i=0; i<dfa_for_expr.states.size(); i++)
		{
			DFA::State &state=dfa_for_expr.states[i];
			
			if(!state.is_accepting) // then make it accepting.
				nfa.add_epsilon_transition(state_mapping[i], local_final_state);
			
			for(int j=0; j<dfa_for_expr.number_of_symbols; j++)
				if(state.transitions[j]>=0)
					nfa.add_transition(state_mapping[i], state_mapping[state.transitions[j]], j);
				else
					nfa.add_transition(state_mapping[i], omniaccepting_state, j);
		}
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionOmittable))
	{
		NonterminalExpressionOmittable &expr_om=*dynamic_cast<NonterminalExpressionOmittable *>(expr);
	#ifdef DEBUG_OMITTABLE
		cout << "omittable: from " << local_initial_state << " to " << local_final_state << "\n";
	#endif
		construct_nfa_proc(nfa, expr_om.expr, local_initial_state,
			local_final_state, recursive_path);
		nfa.add_epsilon_transition(local_initial_state, local_final_state);
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionInParentheses))
	{
		NonterminalExpressionInParentheses &expr_p=*dynamic_cast<NonterminalExpressionInParentheses *>(expr);
		construct_nfa_proc(nfa, expr_p.expr, local_initial_state,
			local_final_state, recursive_path);
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionIteration))
	{
		NonterminalExpressionIteration &expr_it=*dynamic_cast<NonterminalExpressionIteration *>(expr);
		
		int new_state_i=nfa.add_state();
		int new_state_ii=nfa.add_state();
		nfa.add_epsilon_transition(local_initial_state, new_state_i);
		nfa.add_epsilon_transition(new_state_ii, local_final_state);
	#ifdef DEBUG_ITERATION
		cout << "iteration " << (expr_it.reflexive ? "*" : "+")
			<< ": " << local_initial_state << " -> "
			<< new_state_i << " -> " << new_state_ii << " -> "
			<< local_final_state << "\n";
	#endif
		construct_nfa_proc(nfa, expr_it.expr, new_state_i, new_state_ii, recursive_path);
		if(expr_it.reflexive)
			nfa.add_epsilon_transition(new_state_i, new_state_ii);
		nfa.add_epsilon_transition(new_state_ii, new_state_i);
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionCondition))
		assert(false); // it should have been expanded.
	else if(typeid(*expr)==typeid(NonterminalExpressionRange))
	{
		NonterminalExpressionRange &expr_r=*dynamic_cast<NonterminalExpressionRange *>(expr);
	#ifdef DEBUG_RANGE
		cout << "range (state " << local_initial_state << " -> "
			<< local_final_state << "): from " << expr_r.first
			<< " to " << expr_r.last << "\n";
	#endif
		for(int i=expr_r.first; i<=expr_r.last; i++)
			nfa.add_transition(local_initial_state, local_final_state, i);
	}
	else if(typeid(*expr)==typeid(NonterminalExpressionContains))
	{
		NonterminalExpressionContains &expr_cont=*dynamic_cast<NonterminalExpressionContains *>(expr);
		
		int new_state_i=nfa.add_state();
		int new_state_ii=nfa.add_state();
		int new_state_iii=nfa.add_state();
		int new_state_iv=nfa.add_state();
		

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
男人的j进女人的j一区| 成人精品在线视频观看| 国产精品美女视频| 欧美丰满嫩嫩电影| 91啪亚洲精品| 国产久卡久卡久卡久卡视频精品| 亚洲综合久久av| 中文字幕av一区二区三区高 | 综合激情成人伊人| 日韩午夜电影在线观看| 欧美伊人久久大香线蕉综合69| 国产在线国偷精品免费看| 五月激情综合网| 亚洲欧美日韩国产综合在线| 亚洲精品一区二区三区精华液| 欧美午夜精品免费| av成人动漫在线观看| 国产一区欧美日韩| 色网站国产精品| 国产精品一区一区三区| 美腿丝袜一区二区三区| 午夜影视日本亚洲欧洲精品| 亚洲激情网站免费观看| 国产精品三级电影| 国产亚洲美州欧州综合国| 日韩欧美三级在线| 欧美一区二区三区免费观看视频| 欧美日韩一区国产| 欧美日韩亚洲综合一区| 色久综合一二码| 99久久99久久精品免费观看| 高清在线观看日韩| 国产成人超碰人人澡人人澡| 韩国精品久久久| 精品一区二区三区欧美| 麻豆国产欧美一区二区三区| 奇米影视一区二区三区| 日本成人在线看| 蜜臀av一级做a爰片久久| 天天操天天综合网| 日韩 欧美一区二区三区| 偷拍亚洲欧洲综合| 日韩经典一区二区| 久久精品国产一区二区三区免费看| 午夜免费久久看| 天涯成人国产亚洲精品一区av| 亚洲国产中文字幕在线视频综合| 亚洲综合成人网| 亚洲 欧美综合在线网络| 性做久久久久久久免费看| 午夜精彩视频在线观看不卡| 日韩电影在线看| 久久国产精品区| 高清久久久久久| av在线这里只有精品| 91久久精品一区二区三区| 欧美色电影在线| 日韩欧美中文一区二区| www久久久久| 国产日韩欧美精品综合| 中文字幕一区免费在线观看| 有码一区二区三区| 天堂蜜桃91精品| 精品一区二区三区在线播放视频 | 韩国精品在线观看| 不卡的电影网站| 欧美国产欧美亚州国产日韩mv天天看完整| 国产精品免费视频一区| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲v中文字幕| 老司机精品视频线观看86| 风间由美一区二区三区在线观看| 91亚洲国产成人精品一区二三 | 欧美va亚洲va国产综合| 国产欧美日韩综合精品一区二区| 亚洲欧美日韩中文播放| 日韩精品一卡二卡三卡四卡无卡| 国产一区二区三区四区在线观看| 99精品视频在线免费观看| 欧美剧情电影在线观看完整版免费励志电影| 欧美一级精品大片| 国产精品高潮呻吟久久| 天天综合天天综合色| 国产一区二区精品久久99| 91黄视频在线| 久久婷婷综合激情| 亚洲一区二区三区四区在线观看| 久久99国产精品尤物| 91丨九色丨蝌蚪丨老版| 精品美女一区二区三区| 亚洲男同性视频| 狠狠色狠狠色综合日日91app| 91免费版在线看| 久久久99免费| 日韩和的一区二区| av中文字幕亚洲| 精品久久久久久最新网址| 亚洲一区二区三区不卡国产欧美| 国产高清久久久| 欧美日韩亚洲高清一区二区| 欧美国产激情一区二区三区蜜月 | 成人性生交大片免费看视频在线 | 日韩一区二区精品在线观看| 中文字幕亚洲一区二区av在线| 免费黄网站欧美| 欧美三级在线视频| 中文字幕一区二区三区蜜月| 国产在线精品免费| 日韩网站在线看片你懂的| 一区二区三区鲁丝不卡| 成人免费视频播放| 久久视频一区二区| 日本vs亚洲vs韩国一区三区二区 | 久久亚洲一级片| 男人的天堂亚洲一区| 欧美日韩视频在线观看一区二区三区| 国产精品乱码一区二区三区软件 | 裸体歌舞表演一区二区| 欧美三级视频在线播放| 亚洲蜜臀av乱码久久精品| 懂色av一区二区三区免费看| 精品国产免费一区二区三区四区| 日韩精品一级中文字幕精品视频免费观看 | 91精品国产色综合久久ai换脸| 一区二区高清免费观看影视大全 | 26uuu国产在线精品一区二区| 三级一区在线视频先锋| 欧美日韩一区高清| 亚洲综合清纯丝袜自拍| 在线观看欧美黄色| 一区二区三区四区亚洲| 色先锋aa成人| 亚洲一区二区在线免费看| 在线免费精品视频| 亚洲一区二区免费视频| 欧美视频三区在线播放| 亚洲国产sm捆绑调教视频| 欧美日韩亚洲不卡| 日韩国产精品大片| 日韩欧美亚洲国产精品字幕久久久| 婷婷久久综合九色综合伊人色| 欧美精品久久一区| 日本成人在线电影网| 4438亚洲最大| 精品一区二区在线播放| 国产无人区一区二区三区| 国产成人综合视频| 国产精品传媒视频| 欧美优质美女网站| 日韩有码一区二区三区| 精品日韩一区二区三区| 国产精品系列在线播放| 国产精品久久久久影院老司| 91亚洲午夜精品久久久久久| 亚洲大片免费看| 日韩一区二区三区在线观看 | 免费人成黄页网站在线一区二区| 欧美成人性福生活免费看| 国产精品亚洲视频| 国产精品成人午夜| 欧美日韩精品是欧美日韩精品| 日韩高清在线不卡| 国产亚洲女人久久久久毛片| av亚洲产国偷v产偷v自拍| 亚洲一区自拍偷拍| 3d成人动漫网站| 国产91富婆露脸刺激对白| 亚洲日穴在线视频| 337p亚洲精品色噜噜噜| 国产成人免费视频精品含羞草妖精 | 高清国产午夜精品久久久久久| 亚洲欧洲日韩在线| 欧美精品日韩精品| 成人一区二区三区在线观看| 樱花草国产18久久久久| 欧美成人a∨高清免费观看| 成人免费高清在线| 日韩精品久久久久久| 欧美高清在线视频| 欧美日韩国产片| 国产成人精品亚洲777人妖| 亚洲欧洲精品天堂一级| 91精品国产综合久久久蜜臀粉嫩| 国产v综合v亚洲欧| 亚洲成人动漫av| 国产精品青草久久| 日韩午夜精品电影| 色综合久久综合网欧美综合网 | 日产欧产美韩系列久久99| 国产精品免费aⅴ片在线观看| 欧美日韩免费一区二区三区视频| 国产精品一区在线| 日韩激情中文字幕| 亚洲欧美电影一区二区| 精品国精品国产| 在线不卡一区二区| 91在线你懂得| 国产大陆亚洲精品国产| 欧美a级理论片| 亚洲福中文字幕伊人影院|