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

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

?? regular-expressions.zc

?? 實現樹形結構
?? ZC
?? 第 1 頁 / 共 2 頁
字號:
//[of]:description
//[c]Tests if a string matches with a regular expression.
//[cf]
//[of]:imports
import "base/types"
import "base/memory-allocator"
import "collection/collection"
import "collection/vector"
import "text/string-buffer"
import "text/string"
//[cf]
//[of]:definitions
//[c]
typedef char map = [256] byte
equ max groups = 32
//[c]
public struct regex

	private 
		nodes: local vector
		states: local vector
		rules: local vector

		groups: int
		group mask: dword
		group starts: [max groups] string
		group stops: [max groups] string

		initial: state
		final: state

		match beginning: bool
		match ending: bool

		firsts: char map

		// for compilation only
		is case sensitive: bool

end
//[cf]
//[of]:error codes
public enum regex code
	regex ok
	regex missing cpar
	regex empty
	regex invalid range
end
//[c]
//[cf]
//[c]
//[of]:initialize - release
//[of]:initialize
//[c]
public func initialize (m: regex)

	initialize (states (m), 256)
	initialize (nodes (m), 256)
	initialize (rules (m), 256)
	groups (m) = 0
	match beginning (m) = false
	match ending (m) = false

end
//[cf]
//[of]:release
//[c]
public func release (m: regex)

	delete all (m)
	release (states (m))
	release (nodes (m))
	release (rules (m))

end
//[cf]
//[cf]
//[of]:compiling
//[of]:compile (source,case sensitive)
//[c]Compile a regular expression
//[c]
public func compile (m: regex, s: string, is case sensitive: bool)

	is case sensitive (m) = is case sensitive

	delete all (m)
	remove all (nodes (m))
	remove all (states (m))
	remove all (rules (m))
	groups (m) = 0
	group mask (m) = 1
	match beginning (m) = false
	match ending (m) = false
	
	def p = s
	if p[] == $^
		match beginning (m) = true
		p += 1
	end

	def parser: local regex parser
	source (parser) = p

	// 'firsts' is cleared before returning so an compile
	// error will make fail any search without an extra
	// test. So the object is valid and the match function
	// can be used even if the compilation fails.
	initialize (firsts (m))
	
	def node = new or node (m)
	def code = get union (m, parser, node)
	if code <> regex ok
		return code
	end

	def s1 = new state (m)
	def s2 = new state (m)
	expand (m, node, s1, s2)
	initial (m) = s1
	final (m) = s2

	// compute firsts
	scan (m, s1)

	return code

end
//[c]
//[c]Structures:
//[c]
struct regex parser
	source: string
	node: node
end
//[c]
//[c]Subfunctions:
//[of]:scan
//[c]Scan all chars accessibles from this state: all epsilon transitions
//[c]are followed recursively.
//[c]
func scan (m: regex, s: state) : void
	
	if mark (s)
		return
	end
	mark (s) = true

	each (rules (s)) ? r
		equ rule = r: rule
		if epsilon (rule)
			scan (m, state (rule))
		else
			def i = 0
			def p = chars (rule)
			def q = firsts (m)
			while i < 256
				q [i] |= p [i]
				i += 1
			end
		end			
	end
	
end
//[cf]
//[of]:expand
//[c]
func expand (m: regex, node: node, s1: state, s2: state)  : void

	switch (type (node))

	case nt rules
		equ rn = node : rule node
		add rule (s1, s2, rule (rn))

	case nt or
		equ on = node : or node

		def mask = group mask (m)
		group start (s1) |= mask
		group stop (s2) |= mask
		group mask (m) <<= 1
		groups (m) += 1
		
		each (sequences (on)) ? ns
			equ nodes = ns : node
		
			def ss1 = s1
			each (nodes) ? n
				equ subnode = n : node
				def ss2 = is last (subnode) -> s2, new state (m)
				expand (m, subnode, ss1, ss2)
				ss1 = ss2
			end
		end

	case nt zero or many
		equ rn = node : rep node

		def t1 = new state (m)
		def t2 = new state (m)
		expand (m, node (rn), t1, t2)
	
		add epsilon (m, s1, s2)
		add epsilon (m, s1, t1)
		add epsilon (m, t2, s2)
		add epsilon (m, t2, t1)
		
	case nt one or many
		equ rn = node : rep node

		def t1 = new state (m)
		def t2 = new state (m)
		expand (m, node (rn), t1, t2)
	
		add epsilon (m, s1, t1)
		add epsilon (m, t2, s2)
		add epsilon (m, t2, t1)
		
	case nt zero or one
		equ rn = node : rep node
		expand (m, node (rn), s1, s2)
		add epsilon (m, s1, s2)
		
	end

end
//[cf]
//[of]:get union
func get union (m: regex, parser: regex parser, or node: or node) : regex code

	def sequences = sequences (or node)

	repeat
		def nodes: local collection
		def code = get sequence (m, parser, nodes)
		if code <> regex ok
			return code
		end
		def node = first (nodes)
		if is nil (node)
			return regex empty
		end
		add (sequences, node)
		
		def p = source (parser)
		if p[] <> $|
			break
		end
		source (parser) = p + 1
	end
		
	return regex ok

end
//[cf]
//[of]:get sequence
//[c]
func get sequence (m: regex, parser: regex parser, nodes: collection) : regex code

	initialize (nodes)

	repeat
		def code = get node (m, parser)
		if code <> regex ok
			return code
		end
		def node = node (parser)
		if is nil (node)
			break
		end
		add (nodes, node)
	end		

	return regex ok

end
//[cf]
//[of]:get node
func get node (m: regex, parser: regex parser)
	
	def p = source (parser)
	def node = nil : node
	def c = p[]
	switch c
//[of]:	case nul char, ), |
	case nul char, $), $|
		// empty
//[cf]
//[of]:	case $
	case $$
		p += 1
		if is nul (p[])
			match ending (m) = true
		else
			node = new char node (m, c)
		end
//[cf]
//[of]:	case (
	case $(
		def or node = new or node (m)
		source (parser) = p+1
		def code = get union (m, parser, or node)
		if code <> regex ok
			return code
		end
		p = source (parser)
		if p[] <> $)
			return regex missing cpar
		end
		
		node = or node
		p += 1 
//[cf]
//[of]:	case [
	case $[
		def rule = new char rule (m)
		def rule node = new rule node (m, rule)
		p += 1
		p = get ranges (m, rule, p)
		if is nil (p) || p[] <> $]
			source (parser) = p
			return regex invalid range
		end
		node = rule node
		p += 1
//[cf]
//[of]:	case \\
	case $\
		p += 1
		c = get escape char (p[])
		node = new char node (m, c)
		p += 1

//[cf]
//[of]:	case .
	case $.
		node = new rule node (m, new any rule (m))
		p += 1
//[cf]
//[of]:	else
	else
		node = new char node (m, c)
		p += 1
//[cf]
	end

	// Check repeaters
	if not nil (node)
		c = p[]
		if c == $*
			p += 1
			node = new repeat node (m, node, nt zero or many)
		elsif c == $+
			p += 1
			node = new repeat node (m, node, nt one or many)
		elsif c == $?
			p += 1
			node = new repeat node (m, node, nt zero or one)
		end
	end

	source (parser) = p
	node (parser) = node
	
	return regex ok

end
//[c]
//[of]:get ranges
func get ranges (m: regex, rule: rule, s: string)

	def p = s
	
	def invert = false
	if p[] == $^
		invert = true
		p += 1
	end
	
	repeat
		def c = p []
		if is nul (c) || c == $]
			break
		end
		p += 1
		def d = p []
		if c == $\ && d <> nul char
			c = get escape char (d)
			p += 1
			d = p []
		end
		
		if d <> $- || p [1] == $]
			set (rule, c, is case sensitive (m))
		else
			p += 1
			d = p []
			if d == $\ && p [1] <> nul char
				d = get escape char (d)
				p += 1
			end
			if d <> nul char
				set (rule, c, d, is case sensitive (m))
				p += 1
			end
		end
	end

	if invert
		invert (rule)
	end

	return p

end
//[cf]
//[of]:new char node
//[c]
func new char node (m: regex, c: char)
	return new rule node (m, new char rule (m, c))
end
//[cf]
//[cf]
//[cf]
//[cf]
//[of]:matching
//[of]:match (s)
//[c]Returns the end position or nil if no match
//[c]
public func match (m: regex, string: string)

	// quick test
	if firsts (m) [string[0]:byte:int] == 0:byte
		return nil
	end

	// test without group (faster)
	if is nil (test without group (m, string))
		return nil
	end

	// test with groups (slower)	
	return test with groups (m, string)

end
//[c]
equ stack size = 1024
//[c]
public func test without group (m: regex, string: string)

	def stack: [stack size] local scan
	def top = stack + stack size
	def sp = top

	def final = final (m)
	def s = initial (m)
	def p = string
	repeat
		if s == final
			return p
		end
		def c = p[]
		each (rules (s)) ? r
			equ rule = r : rule
			if epsilon (rule)
				if sp == stack
					return nil // stack overflow
				end
				sp -= 1
				s (sp []) = state (rule)
				p (sp []) = p
			elsif match (rule, c)
				if sp == stack
					return nil // stack overflow
				end
				sp -= 1
				s (sp []) = state (rule)
				p (sp []) = p + 1
			end
		end
		
		// pop next
		if sp == top
			break
		end
		
		s = s (sp [])
		p = p (sp [])
		sp += 1
	end
	
	return nil

end
//[c]

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色偷偷成人一区二区三区91 | 91 com成人网| 成人免费高清视频在线观看| 久久99国产精品久久| 玖玖九九国产精品| 激情六月婷婷综合| 国产一二精品视频| 色狠狠桃花综合| 激情综合色播激情啊| 欧美日韩中文另类| 欧美电影免费提供在线观看| 在线观看日韩高清av| 成人免费av在线| 色综合天天综合色综合av | 国产精品久久久爽爽爽麻豆色哟哟| 久久综合色婷婷| 久久精品一区二区三区不卡牛牛 | 国产婷婷精品av在线| 国产日韩在线不卡| 亚洲色欲色欲www| 亚洲国产精品一区二区尤物区| 视频一区中文字幕国产| 精品国产一区二区三区不卡| 久久久久一区二区三区四区| 中文字幕免费一区| 亚洲一区二区三区四区在线观看| 久久99国产精品免费网站| 国产精品一区在线观看乱码| av在线免费不卡| 91精品国产综合久久久久久漫画 | 欧美吞精做爰啪啪高潮| 日韩欧美国产麻豆| 亚洲视频在线观看一区| 婷婷丁香久久五月婷婷| 国产成人av一区二区三区在线| 日本精品一区二区三区高清 | 大陆成人av片| 欧美日本国产视频| **欧美大码日韩| 国内外精品视频| 欧美日韩精品一区二区| 国产精品区一区二区三| 蜜桃一区二区三区在线| 色激情天天射综合网| 亚洲精品在线三区| 天堂va蜜桃一区二区三区漫画版| 国产99久久久久| 91精品国产日韩91久久久久久| 中文字幕一区二区三区不卡| 美国av一区二区| 亚洲国产精品国自产拍av| 丝袜美腿亚洲一区| 色婷婷国产精品综合在线观看| 久久久噜噜噜久久中文字幕色伊伊| 亚洲成人综合视频| 欧美这里有精品| 亚洲图片欧美激情| 成人黄色电影在线| 国产视频一区在线播放| 久久se精品一区精品二区| 欧美日韩国产经典色站一区二区三区| 亚洲丝袜另类动漫二区| 99视频在线精品| 国产精品久久午夜| 成人白浆超碰人人人人| 国产免费观看久久| 粉嫩一区二区三区在线看| 久久久久高清精品| 成人综合在线观看| 久久久99免费| 成人永久看片免费视频天堂| 国产午夜精品一区二区 | 亚洲一区二区欧美日韩| 99久久婷婷国产综合精品| 中文字幕在线不卡视频| 99久久精品免费| 亚洲日本丝袜连裤袜办公室| 99热国产精品| 亚洲精品欧美专区| 欧美三级三级三级爽爽爽| 一个色妞综合视频在线观看| 色哦色哦哦色天天综合| 亚洲一区国产视频| 欧美一区二区美女| 国产精品一区二区黑丝| 中文字幕欧美一| 欧美综合天天夜夜久久| 日一区二区三区| 久久九九久久九九| 色狠狠av一区二区三区| 一区二区三区欧美久久| 制服丝袜亚洲播放| 国产美女一区二区| 一区二区三区欧美亚洲| 日韩一区二区视频| 国产91精品精华液一区二区三区| 亚洲欧美在线另类| 欧美日韩国产一级| 国产成人啪午夜精品网站男同| 国产精品看片你懂得| 欧美三级视频在线观看| 国产乱一区二区| 亚洲精品伦理在线| 日韩欧美精品在线| 91美女在线视频| 另类小说一区二区三区| 天天影视网天天综合色在线播放| 欧美岛国在线观看| 在线一区二区三区四区五区 | 亚洲欧美另类久久久精品2019| 欧美午夜影院一区| 国产成人亚洲精品青草天美| 亚洲欧美激情插| 久久综合色综合88| 在线成人免费视频| 91在线精品一区二区| 激情综合色综合久久| 伊人夜夜躁av伊人久久| 久久人人97超碰com| 欧美日韩国产a| 成人国产精品免费观看视频| 日本aⅴ免费视频一区二区三区| 中文字幕一区二区三区在线播放| 日韩精品一区二区三区视频播放| 91玉足脚交白嫩脚丫在线播放| 久久成人免费网站| 亚洲国产精品影院| 综合色中文字幕| 中文字幕av一区二区三区免费看| 欧美一级日韩免费不卡| 欧美优质美女网站| av高清不卡在线| 国产成人av电影| 国模冰冰炮一区二区| 日韩综合小视频| 亚洲第一在线综合网站| 亚洲激情图片小说视频| 中文字幕一区av| 国产精品亲子乱子伦xxxx裸| 日韩欧美成人激情| 91精品国产欧美一区二区18| 欧美性色黄大片手机版| 91蝌蚪porny| 91在线精品一区二区| 北条麻妃国产九九精品视频| 国产成人午夜片在线观看高清观看| 久久99精品久久久久婷婷| 奇米影视7777精品一区二区| 日韩激情中文字幕| 秋霞午夜鲁丝一区二区老狼| 日韩精品免费视频人成| 免费黄网站欧美| 免费观看成人鲁鲁鲁鲁鲁视频| 日韩高清一级片| 天涯成人国产亚洲精品一区av| 亚洲电影中文字幕在线观看| 亚洲精品欧美专区| 天天色综合成人网| 韩国av一区二区三区在线观看| 经典三级一区二区| 国产成a人亚洲| 波波电影院一区二区三区| 色偷偷成人一区二区三区91| 在线观看亚洲专区| 欧美精品一二三| 久久综合精品国产一区二区三区 | 成人av在线一区二区三区| 99久久er热在这里只有精品66| 91伊人久久大香线蕉| 在线观看网站黄不卡| 欧美精品第一页| 26uuu久久综合| 国产精品久久久久久久久动漫| 一区二区三区在线免费观看 | 国产精品第四页| 亚洲一区精品在线| 韩国三级电影一区二区| 97久久超碰国产精品| 欧美一区二区三区视频免费播放| 久久久精品tv| 亚洲一区二区三区激情| 国产一区二区三区免费看| 99国产精品一区| 日韩小视频在线观看专区| 国产片一区二区| 亚洲丶国产丶欧美一区二区三区| 国产精品自在在线| 色屁屁一区二区| 久久久久久久久久久99999| 亚洲激情网站免费观看| 精品久久久久久久久久久久包黑料| bt7086福利一区国产| 欧美色图免费看| 久久久综合视频| 亚洲一区精品在线| www.99精品| 26uuu亚洲综合色欧美| 亚洲精品日韩综合观看成人91| 国产一区日韩二区欧美三区| 91官网在线观看|