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

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

?? tables.cpp

?? Full support for extended regular expressions (those with intersection and complement); Support for
?? CPP
字號:

// Experimental table compression routines.

#include "dolphin.h"
#include "tables.h"
#include "stl.h"
#include <fstream>
using namespace std;

//#define DUMP_SIMILARITY_RELATION

struct DifferenceBetweenLines
{
	bool identical;
	int region_begin;
	int region_end;
};

void compress_transition_table();
void compress_tables_layer_1();
void compress_tables_layer_2();
DifferenceBetweenLines find_difference_between_layer1_lines(int line1, int line2);

void make_table_of_lookahead_states();
void make_start_condition_to_dfa_state_table();

void make_tables()
{
	if(data.variables.compress_tables)
		compress_transition_table();
	if(data.variables.generate_arbitrary_lookahead_support)
		make_table_of_lookahead_states();
	make_start_condition_to_dfa_state_table();
}

void compress_transition_table()
{
	int m=data.number_of_symbol_classes;
	
	cout << "Compressing transition table: ";
	
	if(data.variables.using_layer2)
	{
		cout << "layer 1";
		cout.flush();
	}
	
	compress_tables_layer_1();
	
	if(data.variables.using_layer2) cout << " (";
	cout << data.tables.layer1_to_state.size() << " lines";
	if(data.variables.using_layer2)
		cout << ")";
	else
		cout << ".\n";
        
        if(data.variables.using_layer2)
	{
		cout << ", layer 2";
		cout.flush();
		
		compress_tables_layer_2();
		
		cout << " (" << data.tables.layer2_to_layer1.size() << " lines).\n";
	}
	
	TableMaker tm(data.tables.compressed_table_of_lines);
	if(!data.variables.using_layer2)
		for(int i=0; i<data.tables.layer1_to_state.size(); i++)
		{
			int i_state=data.tables.layer1_to_state[i];
			std::vector<int> v;
			
			/* INCREMENT IS HERE! */
			for(int j=0; j<m; j++)
				v.push_back(data.final_automaton[i_state].transitions[j]+1);
			
			int offset=tm.add(v);
			data.tables.line_to_offset_in_table_of_lines.push_back(offset);
		}
	else
		for(int i=0; i<data.tables.layer2_to_layer1.size(); i++)
		{
			int i_layer1=data.tables.layer2_to_layer1[i];
			int i_state=data.tables.layer1_to_state[i_layer1];
			std::vector<int> v;
			
			/* INCREMENT IS HERE! */
			for(int j=0; j<m; j++)
				v.push_back(data.final_automaton[i_state].transitions[j]+1);
			
			int offset=tm.add(v);
			data.tables.line_to_offset_in_table_of_lines.push_back(offset);
		}
}

void compress_tables_layer_1()
{
	int n=data.final_automaton.size();
	int m=data.number_of_symbol_classes;
	
	// It could be done in n*log(n) time, but I'm too lazy to do that.
	
	data.tables.state_to_layer1=vector<int>(n, -2);
	
	for(int i=0; i<n; i++)
		if(data.tables.state_to_layer1[i]==-2)
		{
			int this_line_number=data.tables.layer1_to_state.size();
			data.tables.layer1_to_state.push_back(i);
			data.tables.state_to_layer1[i]=this_line_number;
			
			bool it_is_null=true;
			for(int j=0; j<m; j++)
				if(data.final_automaton[i].transitions[j]!=-1)
				{
					it_is_null=false;
					break;
				}
			if(it_is_null)
				data.tables.null_line_number=i;
			
			for(int k=i+1; k<n; k++)
				if(data.tables.state_to_layer1[k]==-2)
				{
					bool all_equal=true;
					for(int j=0; j<m; j++)
						if(data.final_automaton[i].transitions[j]!=data.final_automaton[k].transitions[j])
						{
							all_equal=false;
							break;
						}
					if(all_equal)
						data.tables.state_to_layer1[k]=this_line_number;
				}
		}
}

void compress_tables_layer_2()
{
	int n=data.tables.layer1_to_state.size();
	
	/* similarity_relation[i] is a sorted vector of numbers of those    */
	/* lines that are similar to i-th line. Lines should be distinct.   */
	vector<vector<int> > similarity_relation(n, vector<int>());
	
	for(int i=0; i<n; i++)
		for(int k=0; k<n; k++)
		{
			if(i==k) continue;
			
			DifferenceBetweenLines difference=find_difference_between_layer1_lines(i, k);
			assert(!difference.identical);
			int width=difference.region_end-difference.region_begin;
			assert(width>0);
			
			if(width<=data.variables.table_compression_exception_width)
			{
				similarity_relation[i].push_back(k);
				continue;
			}
		}
	
#ifdef DUMP_SIMILARITY_RELATION
	ofstream a("similarity_relation");
	
	for(int i=0; i<n; i++)
	{
		a << i << ": " << similarity_relation[i] << "\n";
	}
	
	a << "\n";
#endif
	
	set<int> lines_left;
	for(int i=0; i<n; i++) // how to write it in C*n time?
	{
		lines_left.insert(i);
		data.tables.layer1_to_layer2.push_back(-1);
		data.tables.layer1_to_exception_location.push_back(-1);
		data.tables.layer1_to_exception_data.push_back(vector<int>());
	}
	
	while(lines_left.size())
	{
		// The line that has the greatest number of neighbours.
		int the_line=*lines_left.begin();
		for(set<int>::const_iterator p=lines_left.begin(); p!=lines_left.end(); p++)
			if(similarity_relation[*p].size()>similarity_relation[the_line].size())
				the_line=*p;
		
		int layer_2_line=data.tables.layer2_to_layer1.size();
		data.tables.layer2_to_layer1.push_back(the_line);
		
	#ifdef DUMP_SIMILARITY_RELATION
		a << "Processing line " << the_line << " (" << similarity_relation[the_line].size() << " neighbours).\n";
	#endif
		
		// Store information about "exceptions" - those fragments in
		// neighbouring lines that differ from the current line.
		
		for(int i=0; i<similarity_relation[the_line].size(); i++)
		{
			int current_line=similarity_relation[the_line][i];
			int cl_state=data.tables.layer1_to_state[current_line];
			
			DifferenceBetweenLines d=find_difference_between_layer1_lines(the_line, current_line);
			assert(!d.identical);
			assert(d.region_end-d.region_begin<=data.variables.table_compression_exception_width);
			
			data.tables.layer1_to_exception_location[current_line]=d.region_begin;
		//	data.tables.layer1_to_exception_data[current_line]=vector<int>(data.final_transition_table.at(cl_state, d.region_begin), data.final_transition_table.at(cl_state, d.region_end));
			
			// INCREMENT HERE. Ought to bring a uniform enumeration.
			for(int i=d.region_begin; i<d.region_end; i++)
				data.tables.layer1_to_exception_data[current_line].push_back(data.final_automaton[cl_state].transitions[i] + 1);
		}
		
		// Now we shall
		// i. Remove this line together with its neighbours from the
		//	list of lines to process.
		// ii. Remove all references to all these lines from the vectors.
		
		set<int> lines_to_erase(similarity_relation[the_line].begin(), similarity_relation[the_line].end());
		lines_to_erase.insert(the_line);
		assert(lines_to_erase.size()==similarity_relation[the_line].size()+1);
		
		for(set<int>::const_iterator p=lines_to_erase.begin(); p!=lines_to_erase.end(); p++)
		{
			data.tables.layer1_to_layer2[*p]=layer_2_line;
			lines_left.erase(*p);
		}
		
		for(int i=0; i<n; i++)
		{
			vector<int> temp;
			set_difference(similarity_relation[i].begin(), similarity_relation[i].end(),
				lines_to_erase.begin(), lines_to_erase.end(), back_inserter(temp));
			similarity_relation[i]=temp;
		}
	}
}

DifferenceBetweenLines find_difference_between_layer1_lines(int line1, int line2)
{
	DifferenceBetweenLines difference;
	
	int m=data.number_of_symbol_classes;
	
	// Using the simpliest method: two vectors are similar if there exist
	// p1 and p2, such that
	//	p1 < p2,
	//	p2-p1 < some predefined d,
	//	v1 and v2 are identical everywhere except the region between
	//		p1 and p2.
	// It is possible to use any other relation of similarity instead. It
	// should not necessarily be reflexive.
	
	int state1=data.tables.layer1_to_state[line1];
	int state2=data.tables.layer1_to_state[line2];
	
	bool before_region=true;
	difference.region_begin=0;
	difference.region_end=m;
	for(int j=0; j<m; j++)
	{
		if(before_region &&
			data.final_automaton[state1].transitions[j]==
			data.final_automaton[state2].transitions[j])
		{
			difference.region_begin=j+1;
		}
		if(data.final_automaton[state1].transitions[j]!=
			data.final_automaton[state2].transitions[j])
		{
			before_region=false;
			difference.region_end=j+1;
		}
	}
	
//	cout << "[" << difference.region_begin << ", " << difference.region_end << "]\n";
	difference.identical=before_region;
	
	return difference;
}

void make_start_condition_to_dfa_state_table()
{
	for(int i=0; i<data.start_conditions.size(); i++)
	{
		int initial_state_in_uncompressed_dfa=data.start_conditions[i].offset_of_local_states_in_main_dfa;
		int initial_state_in_minimized_dfa=data.dfa_partition.state_to_group[initial_state_in_uncompressed_dfa];
		
		// they are goddamn incremented by one (dactylic pentameter)
		data.tables.start_condition_to_dfa_state_table.push_back(initial_state_in_minimized_dfa+1);
	}
}

void make_table_of_lookahead_states()
{
	cout << "make_table_of_lookahead_states()\n";
	
	TableMaker tm(data.tables.compressed_table_of_lookahead_states);
	for(int i=0; i<data.actions.size(); i++)
	{
		ActionData &action=data.actions[i];
		RecognizedExpressionData &re=data.recognized_expressions[action.recognized_expression_number];
		if(re.lookahead_length!=-1)
		{
			data.tables.offset_in_table_of_lookahead_states.push_back(0);
			data.tables.number_of_lookahead_states.push_back(0);
			continue;
		}
		
		vector<int> states;
		for(int j=0; j<data.final_automaton.size(); j++)
			if(data.final_automaton[j].actions_that_need_lookahead_here.count(i))
				states.push_back(j+1); // damn this increment!
		
		int offset=tm.add(states);
		
		data.tables.offset_in_table_of_lookahead_states.push_back(offset);
		data.tables.number_of_lookahead_states.push_back(states.size());
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲自拍偷拍av| 久久精品一二三| 91蜜桃传媒精品久久久一区二区| 蜜桃视频一区二区| 青娱乐精品视频在线| 午夜欧美视频在线观看| 亚洲成人免费视频| 日日夜夜精品免费视频| 天堂av在线一区| 麻豆视频观看网址久久| 韩国av一区二区三区在线观看| 蜜桃视频一区二区| 国产精品一品视频| a级高清视频欧美日韩| 91视频观看视频| 欧美视频中文字幕| 91精品欧美久久久久久动漫| 日韩你懂的电影在线观看| 日韩欧美亚洲国产精品字幕久久久| 欧美一级二级三级乱码| 2020国产精品自拍| 中文字幕五月欧美| 午夜精品福利一区二区蜜股av| 爽爽淫人综合网网站| 老司机午夜精品99久久| 国产aⅴ精品一区二区三区色成熟| 国产91精品免费| 欧美在线啊v一区| 日韩一级大片在线| 国产精品伦理在线| 亚洲h精品动漫在线观看| 美女性感视频久久| 99久久精品国产一区| 欧美日韩中文精品| 久久久国产午夜精品| 亚洲欧美一区二区三区孕妇| 日本视频一区二区三区| 成人高清视频在线| 91精品国产色综合久久不卡电影| 国产偷国产偷亚洲高清人白洁| 一区二区三区日韩精品| 麻豆91在线观看| 色婷婷久久久综合中文字幕| 欧美大片拔萝卜| 亚洲黄色片在线观看| 国产一区二区三区在线观看精品 | 亚洲视频在线观看一区| 日韩av一二三| 波多野洁衣一区| 欧美成人一级视频| 五月开心婷婷久久| 不卡的看片网站| 久久久精品中文字幕麻豆发布| 亚洲精品国产品国语在线app| 国产一区不卡在线| 51精品视频一区二区三区| 亚洲婷婷综合久久一本伊一区| 精品一区免费av| 欧美日韩亚洲另类| 亚洲天天做日日做天天谢日日欢| 韩国理伦片一区二区三区在线播放 | 色老汉av一区二区三区| 久久精品视频免费| 国内精品国产成人国产三级粉色 | 日av在线不卡| 欧美图区在线视频| 一区二区三区日韩欧美精品| 成人aa视频在线观看| 欧美精彩视频一区二区三区| 国内精品视频666| 精品毛片乱码1区2区3区| 日韩av一区二| 欧美一区二区免费| 日韩高清中文字幕一区| 7777精品伊人久久久大香线蕉经典版下载 | 亚洲成av人片| 欧美日韩在线免费视频| 亚洲综合一区二区精品导航| 91丨porny丨首页| 亚洲欧美国产高清| 色天使久久综合网天天| 一区二区激情视频| 欧美吻胸吃奶大尺度电影| 亚洲一区二区三区中文字幕在线| 色综合久久天天| 亚洲最大成人网4388xx| 欧美影院一区二区| 香蕉影视欧美成人| 欧美一区二区三区视频在线| 日本最新不卡在线| 久久人人97超碰com| 风间由美一区二区三区在线观看| 久久久国产精华| av在线免费不卡| 亚洲狠狠丁香婷婷综合久久久| 欧美天堂一区二区三区| 青娱乐精品在线视频| 国产日韩一级二级三级| 91日韩精品一区| 偷窥少妇高潮呻吟av久久免费| 在线播放中文字幕一区| 久久99日本精品| 国产精品免费免费| 欧美日韩精品久久久| 国产一区二区三区蝌蚪| 亚洲日本一区二区| 日韩一区二区三免费高清| 国产乱色国产精品免费视频| 综合电影一区二区三区 | 久久久电影一区二区三区| 成人激情免费视频| 午夜av区久久| 国产精品卡一卡二| 欧美一区二区在线播放| 成人黄色在线视频| 日本午夜精品视频在线观看| 国产精品毛片久久久久久| 欧美日韩亚洲丝袜制服| 亚洲精品一线二线三线无人区| 中文在线一区二区 | 一个色妞综合视频在线观看| 制服丝袜av成人在线看| 国产aⅴ精品一区二区三区色成熟| 亚洲宅男天堂在线观看无病毒| 精品久久久久一区| 欧美日韩精品一区二区三区| 国产91精品在线观看| 亚洲国产日韩av| 国产精品午夜在线观看| 日韩欧美精品三级| 欧美系列一区二区| 99久久婷婷国产综合精品| 狠狠色综合播放一区二区| 亚洲永久精品国产| 综合分类小说区另类春色亚洲小说欧美| 日韩一区二区电影| 在线播放91灌醉迷j高跟美女| 国产91色综合久久免费分享| 久久色在线观看| 99视频有精品| 懂色av中文一区二区三区| 久久9热精品视频| 日韩国产高清影视| 天堂va蜜桃一区二区三区漫画版 | 国产成人在线免费观看| 蜜臀国产一区二区三区在线播放| 亚洲综合图片区| 一区二区久久久久久| 国产精品高潮呻吟| 国产精品久久毛片av大全日韩| 久久久亚洲高清| 久久久精品tv| 国产欧美久久久精品影院| 久久久欧美精品sm网站| 2024国产精品| 日本一区二区成人| 国产精品三级av| 自拍偷拍亚洲综合| 一区二区三区日韩在线观看| 亚洲久本草在线中文字幕| 亚洲人亚洲人成电影网站色| 亚洲三级理论片| 一区二区三区成人| 亚洲大片精品永久免费| 日韩在线一区二区| 久久精品免费看| 国产成人一级电影| 不卡视频免费播放| 91成人在线免费观看| 欧美午夜在线一二页| 欧美一区二区视频在线观看 | 色成年激情久久综合| 在线观看区一区二| 欧美一二三四区在线| 久久精品视频一区二区| 成人欧美一区二区三区视频网页| 亚洲欧美日韩国产一区二区三区| 亚洲国产综合91精品麻豆| 奇米影视7777精品一区二区| 国产精品亚洲午夜一区二区三区| 国产不卡免费视频| 欧美日韩一区二区在线观看| 日韩精品在线一区二区| 国产精品污网站| 日韩在线播放一区二区| 看片网站欧美日韩| 国产精品久久久久桃色tv| 日韩av网站在线观看| 精品一区二区三区免费| 欧美精品日韩综合在线| 91亚洲精华国产精华精华液| av不卡免费在线观看| 欧美在线free| 国产清纯白嫩初高生在线观看91 | 蜜臀av性久久久久蜜臀aⅴ| 懂色一区二区三区免费观看| 欧美日韩成人在线| 日韩理论在线观看| 久久99九九99精品| 欧美日韩在线直播|