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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? parse.c

?? agrep
?? C
字號:
/* the functions in this file parse a string that represents   a regular expression, and return a pointer to a syntax   tree for that regular expression.				*/#include <stdio.h>#include "re.h"#define FALSE	0#define TRUE	1#define NextChar(s)	 *(*s)++#define Unexpected(s, c) (**s == NUL || **s == c)#define Invalid_range(x, y)    (x == NUL || x == '-' || x == ']' || x < y)extern Stack Push();extern Re_node Pop();extern Re_node Top();extern int Size();extern Pset pset_union();extern Pset create_pos();int final_pos, pos_cnt = 0;/* retract_token() moves the string pointer back, effectively "unseeing"   the last character seen.  It is used only to retract a right paren --   the idea is that the incarnation of parse_re() that saw the corresponding   left paren is supposed to take care of matching the right paren.  This   is necessary to prevent recursive calls from mistakenly eating up someone   else's right parens.						    */#define retract_token(s)    --(*s)/* mk_leaf() creates a leaf node that is (usually) a literal node.	*/Re_node mk_leaf(opval, type, ch, cset)short opval, type;char ch;Ch_Set cset;{    Re_node node; Re_Lit l;    l = (Re_Lit) new_node(l);    node = (Re_node) new_node(node);    if (l == NULL || node == NULL) return NULL;    lit_type(l) = type;    lit_pos(l)  = pos_cnt++;    if (type == C_SET) lit_cset(l) = cset;    else lit_char(l) = ch;			/* type == C_LIT */    Op(node) = opval;    Lit(node) = l;    Nullable(node) = FALSE;    Firstpos(node) = create_pos(lit_pos(l));    Lastpos(node) = Firstpos(node);    return node;}/* parse_cset() takes a pointer to a pointer to a string and parses   a prefix of it denoting a character set literal.  It returns a pointer   to a Re_node node, NULL if there is an error.			*/Re_node parse_cset(s)char **s;{    Ch_Set cs_ptr, curr_ptr, prev_ptr;    char ch;    Ch_Range range;    if (Unexpected(s, ']')) return NULL;    curr_ptr = (Ch_Set) new_node(curr_ptr); cs_ptr = curr_ptr;    while (!Unexpected(s, ']')) {        range = (Ch_Range)new_node(range);	curr_ptr->elt = range;	ch = NextChar(s);	if (ch == '-') return NULL;	/* invalid range */	range->low_bd = ch;	if (**s == NUL) return NULL;	else if (**s == '-') {		/* character range */	    (*s)++;	    if (Invalid_range(**s, ch)) return NULL;	    else range->hi_bd = NextChar(s);	}	else range->hi_bd = ch;	prev_ptr = curr_ptr;	curr_ptr = (Ch_Set) new_node(curr_ptr);	prev_ptr->rest = curr_ptr;    };    if (**s == ']') {	prev_ptr->rest = NULL;	return mk_leaf(LITERAL, C_SET, NUL, cs_ptr);    }    else return NULL;} /* parse_cset *//* parse_wildcard() "parses" a wildcard -- a wildcard is treated as a   character range whose values span all ASCII values.  parse_wildcard()   creates a node representing such a range.				*/Re_node parse_wildcard(){    Ch_Set s; Ch_Range r;    r = (Ch_Range) new_node(r);    r->low_bd = ASCII_MIN;	/* smallest ASCII value */    r->hi_bd  = ASCII_MAX;	/* greatest ASCII value */    s = (Ch_Set) new_node(s);    s->elt = r;    s->rest = NULL;    return mk_leaf(LITERAL, C_SET, NUL, s);}/* parse_chlit() parses a character literal.  It is assumed that the   character in question does not have any special meaning.  It returns   a pointer to a node for that literal.				*/Re_node parse_chlit(ch)char ch;{    if (ch == NUL) return NULL;    else return mk_leaf(LITERAL, C_LIT, ch, NULL);}/* get_token() returns the next token -- this may be a character   literal, a character set, an escaped character, a punctuation (i.e.   parenthesis), or an operator.  It traverses the character string   representing the RE, given by a pointer s; leaves s positioned   immediately after the unit it parsed, and returns a pointer to   a token node for that unit.  */Tok_node get_token(s)char **s;{    Tok_node rn = NULL;    if (s == NULL || *s == NULL) return NULL;	/* error */    rn = (Tok_node) new_node(rn);    if (**s == NUL) tok_type(rn) = EOS; /* end of string */    else {	switch (**s) {	    case '.':			/* wildcard */		tok_type(rn) = LITERAL;		tok_val(rn) =  parse_wildcard();		if (tok_val(rn) == NULL) return NULL;		break;	    case '[':			/* character set literal */		(*s)++;		tok_type(rn) = LITERAL;		tok_val(rn) = parse_cset(s);		if (tok_val(rn) == NULL) return NULL;		break;	    case '(':	        tok_type(rn) = LPAREN;		break;	    case ')' : 	        tok_type(rn) = RPAREN;		break;	    case '*' :	        tok_type(rn) = OPSTAR;		break;	    case '|' :	        tok_type(rn) = OPALT;		break;	    case '?' : 	        tok_type(rn) = OPOPT;		break;	    case '\\':			/* escaped character */		(*s)++;	    default :			/* must be ordinary character */		tok_type(rn) = LITERAL;		tok_val(rn) = parse_chlit(**s);		if (tok_val(rn) == NULL) return NULL;		break;	} /* switch (**s) */	(*s)++;    } /* else */    return rn;}/* cat2() takes a stack of RE-nodes and, if the stack contains   more than one node, returns the stack obtained by condensing   the top two nodes of the stack into a single CAT-node.  If there   is only one node on the stack,  nothing is done.		    */Stack cat2(stk)Stack *stk;{    Re_node r;    if (stk == NULL) return NULL;    if (*stk == NULL || (*stk)->next == NULL) return *stk;    r = (Re_node) new_node(r);    if (r == NULL) return NULL;	    /* can't allocate memory */    Op(r) = OPCAT;    Rchild(r) = Pop(stk);    Lchild(r) = Pop(stk);    if (Push(stk, r) == NULL) return NULL;    Nullable(r) = Nullable(Lchild(r)) && Nullable(Rchild(r));    if (Nullable(Lchild(r)))	Firstpos(r) = pset_union(Firstpos(Lchild(r)), Firstpos(Rchild(r)));    else Firstpos(r) = Firstpos(Lchild(r));    if (Nullable(Rchild(r)))	Lastpos(r) = pset_union(Lastpos(Lchild(r)), Lastpos(Rchild(r)));    else Lastpos(r) = Lastpos(Rchild(r));    return *stk;}/* wrap() takes a stack and an operator, takes the top element of the   stack and "wraps" that operator around it, then puts this back on the   stack and returns the resulting stack.				*/Stack wrap(s, opv)Stack *s;short opv;{    Re_node r;    if (s == NULL || *s == NULL) return NULL;    r = (Re_node) new_node(r);    if (r == NULL) return NULL;    Op(r) = opv;    Child(r) = Pop(s);    if (Push(s, r) == NULL) return NULL;    Nullable(r) = TRUE;    Firstpos(r) = Firstpos(Child(r));    Lastpos(r)  = Lastpos(Child(r));    return *s;}/* mk_alt() takes a stack and a regular expression, creates an ALT-node   from the top of the stack and the given RE, and replaces the top-of-stack   by the resulting ALT-node.						*/   Stack mk_alt(s, r)Stack *s;Re_node r;{    Re_node node;    if (s == NULL || *s == NULL || r == NULL) return NULL;    node = (Re_node) new_node(node);    if (node == NULL) return NULL;    Op(node) = OPALT;    Lchild(node) = Pop(s);    Rchild(node) = r;    if (Push(s, node) == NULL) return NULL;    Nullable(node) = Nullable(Lchild(node)) || Nullable(Rchild(node));    Firstpos(node) = pset_union(Firstpos(Lchild(node)), Firstpos(Rchild(node)));    Lastpos(node) = pset_union(Lastpos(Lchild(node)), Lastpos(Rchild(node)));    return *s;}/* parse_re() takes a pointer to a string and traverses that string,   returning a pointer to a syntax tree for the regular expression   represented by that string, NULL if there is an error.		*/Re_node parse_re(s, end)char **s;short end;{    Stack stk = NULL, temp;    Tok_node next_token;    Re_node re = NULL;    if (s == NULL || *s == NULL) return NULL;    while (TRUE) {	next_token = get_token(s);	if (next_token == NULL) return NULL;	switch (tok_type(next_token)) {	    case RPAREN:		retract_token(s);	    case EOS:		if (end == tok_type(next_token)) return Top(cat2(&stk));		else return NULL;	    case LPAREN:		re = parse_re(s, RPAREN);		if (Push(&stk, re) == NULL) return NULL;		if (tok_type(get_token(s)) != RPAREN || re == NULL) return NULL;		if (Size(stk) > 2) {		    temp = stk->next;		    stk->next = cat2(&temp);	/* condense CAT nodes */		    if (stk->next == NULL) return NULL;		    else stk->size = stk->next->size + 1;		}		break;	    case OPSTAR:		if (wrap(&stk, OPSTAR) == NULL) return NULL;		break;	    case OPOPT:		if (wrap(&stk, OPOPT) == NULL) return NULL;	        break;	    case OPALT:		if (cat2(&stk) == NULL) return NULL;		re = parse_re(s, end);	        if (re == NULL) return NULL;		if (mk_alt(&stk, re) == NULL) return NULL;		break;	    case LITERAL:		if (Push(&stk, tok_val(next_token)) == NULL) return NULL;		if (Size(stk) > 2) {		    temp = stk->next;		    stk->next = cat2(&temp);    /* condense CAT nodes */		    if (stk->next == NULL) return NULL;		    else stk->size = stk->next->size + 1;		}		break;	    default:		printf("parse_re: unknown token type %d\n", tok_type(next_token));		break;	}    }}/* parse() essentially just calls parse_re().  Its purpose is to stick an   end-of-string token at the end of the syntax tree returned by parse_re().   It should really be done in parse_re, but the recursion there makes it   more desirable to have it here.					*/Re_node parse(s)char *s;{    Re_node tree, temp;    Stack stk = NULL;    tree = parse_re(&s, NUL);    if (tree == NULL || Push(&stk, tree) == NULL) return NULL;    temp = mk_leaf(EOS, C_LIT, NUL, NULL);    if (temp == NULL || Push(&stk, temp) == NULL) return NULL;    final_pos = --pos_cnt;    return Top(cat2(&stk));}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜电影在线播放| 色噜噜久久综合| 婷婷成人激情在线网| 亚洲色欲色欲www在线观看| 欧美一二三在线| 欧美日韩国产bt| 在线观看日韩电影| 色素色在线综合| 一本到高清视频免费精品| 国产成人午夜片在线观看高清观看| 午夜欧美大尺度福利影院在线看| 亚洲黄色免费电影| 夜夜爽夜夜爽精品视频| 夜夜夜精品看看| 亚瑟在线精品视频| 亚洲成av人综合在线观看| 日韩主播视频在线| 美女一区二区三区在线观看| 国产真实乱子伦精品视频| 国内精品伊人久久久久av一坑| 蜜桃久久久久久久| 国产成人午夜视频| 91视频com| 欧美亚洲国产一区二区三区 | 日本道精品一区二区三区| 99久久精品免费看国产免费软件| 色88888久久久久久影院野外| 欧美性xxxxxx少妇| 日韩一区二区三区免费看| 日韩美女一区二区三区四区| 欧美变态凌虐bdsm| 综合中文字幕亚洲| 日韩精品乱码免费| 国产成人av影院| 欧美性videosxxxxx| 久久蜜臀中文字幕| 玉米视频成人免费看| 久久精品国产亚洲高清剧情介绍| 国产精品18久久久久久久久 | 国产剧情一区二区三区| 一本色道亚洲精品aⅴ| 日韩一级精品视频在线观看| 国产精品青草综合久久久久99| 亚洲国产人成综合网站| 久久精品久久精品| 欧美吻胸吃奶大尺度电影| 久久一夜天堂av一区二区三区| 亚洲欧美偷拍另类a∨色屁股| 久久激情综合网| 欧美日韩在线三级| 亚洲男人的天堂av| 成人免费的视频| 欧美精品一区二区三区久久久 | 成人性色生活片免费看爆迷你毛片| 欧美性受xxxx| 亚洲欧美国产77777| 国产精品69毛片高清亚洲| 精品久久久久久久久久久久久久久 | 国产麻豆精品在线观看| 69堂国产成人免费视频| 一区二区三区精品| 色婷婷久久99综合精品jk白丝| 国产精品久久午夜夜伦鲁鲁| 国产激情视频一区二区在线观看| 欧美一区二区免费| 美女视频网站久久| 欧美一级理论性理论a| 免费人成在线不卡| 精品毛片乱码1区2区3区| 美女诱惑一区二区| 精品福利在线导航| 国产成人精品一区二| 91网站黄www| 夜夜操天天操亚洲| 国产亚洲欧洲一区高清在线观看| 亚洲在线中文字幕| 99精品在线观看视频| 18欧美亚洲精品| 欧美日韩国产综合视频在线观看 | 亚洲男人的天堂在线观看| 91福利区一区二区三区| 免费高清成人在线| 国产精品视频麻豆| 欧美主播一区二区三区| 免费不卡在线视频| 综合精品久久久| 日韩无一区二区| 色呦呦一区二区三区| 麻豆国产精品一区二区三区 | 国产日韩精品一区| 欧美日韩国产综合一区二区| 国产一区二区三区四区五区入口| 国产精品久久久一本精品| 欧美一区二区三区在线看| 成人黄色在线看| 日韩成人免费电影| 亚洲素人一区二区| 精品成人一区二区三区四区| 91久久精品国产91性色tv| 国产精品一区在线| 精品在线视频一区| 首页亚洲欧美制服丝腿| ●精品国产综合乱码久久久久| 欧美性受xxxx黑人xyx| 成人性生交大片免费| 国产一区二区三区最好精华液| 亚洲国产精品天堂| 一区二区三区精品视频在线| 国产精品免费丝袜| 国产欧美日韩三区| 久久久午夜精品理论片中文字幕| 制服丝袜亚洲精品中文字幕| 在线中文字幕不卡| 91香蕉视频污| 欧美性色综合网| 欧美最新大片在线看 | 日韩精品每日更新| 日韩高清欧美激情| 日本美女一区二区三区| 日本女优在线视频一区二区| 人人超碰91尤物精品国产| 亚洲成a人片在线不卡一二三区| 亚洲丰满少妇videoshd| 性做久久久久久免费观看| 日本成人在线不卡视频| 另类欧美日韩国产在线| 国产成人在线视频免费播放| 成人激情午夜影院| 欧美丝袜自拍制服另类| 精品视频一区二区三区免费| 欧美日韩中字一区| 日韩视频一区二区三区在线播放 | 91麻豆精品久久久久蜜臀| 精品国产sm最大网站免费看| 久久精品视频在线看| 国产精品看片你懂得| 一区二区三区在线视频免费| 丝袜美腿高跟呻吟高潮一区| 国产一区二区三区在线观看精品| 99国产精品国产精品久久| 91麻豆精品久久久久蜜臀| 国产亚洲欧美日韩日本| 亚洲国产欧美日韩另类综合| 美女免费视频一区| 91丨porny丨户外露出| 在线不卡一区二区| 国产欧美日韩麻豆91| 午夜视频一区二区| 成人app软件下载大全免费| 91精品在线一区二区| 亚洲精品国产成人久久av盗摄 | 懂色一区二区三区免费观看| 51久久夜色精品国产麻豆| 国产精品嫩草久久久久| 热久久免费视频| 欧美群妇大交群中文字幕| 国产精品美女www爽爽爽| 韩国中文字幕2020精品| 欧美丰满少妇xxxxx高潮对白| 成人免费视频在线观看| 国产成人综合网站| 久久久久国产精品免费免费搜索| 亚洲成av人片| 欧美日韩国产bt| 亚洲18女电影在线观看| 国产亚洲人成网站| 麻豆视频观看网址久久| 欧美精品在线一区二区| 亚洲超丰满肉感bbw| 欧美日韩视频不卡| 天天综合色天天| 欧美一卡二卡在线| 轻轻草成人在线| 337p日本欧洲亚洲大胆色噜噜| 加勒比av一区二区| 久久精品视频一区| 福利一区在线观看| 国产精品久久久久婷婷二区次| 国产成人99久久亚洲综合精品| 久久久久久久久99精品| 成人午夜激情片| 亚洲激情图片qvod| 欧美另类高清zo欧美| 国产原创一区二区| 国产精品二三区| 欧美日韩一区二区三区视频| 日本亚洲欧美天堂免费| 久久久久国产成人精品亚洲午夜| 99免费精品在线| 一区二区三区视频在线观看| 欧美男男青年gay1069videost| 美国十次了思思久久精品导航| 中文字幕免费观看一区| 欧美日本韩国一区二区三区视频| 日本高清不卡aⅴ免费网站| 婷婷丁香久久五月婷婷| 久久久久国产精品免费免费搜索| 91欧美一区二区| 精品中文字幕一区二区小辣椒| 一区二区中文字幕在线|