예제 #1
0
파일: sh6.c 프로젝트: alwayrun/v6shell
/*
 * syn2:
 *	syn3
 *	syn3 | syn2
 *	syn3 ^ syn2
 */
static struct tnode *
syn2(char **p1, char **p2)
{
	struct tnode *t;
	int subcnt;
	char **p;

	subcnt = 0;
	for (p = p1; p < p2; p++)
		switch (**p) {
		case LPARENTHESIS:
			subcnt++;
			continue;

		case RPARENTHESIS:
			subcnt--;
			continue;

		case VERTICALBAR:
		case CARET:
			if (subcnt == 0) {
				if ((t = talloc()) == NULL)
					return NULL;
				t->ntype  = TPIPE;
				t->nleft  = syn3(p1, p);
				t->nright = syn2(p + 1, p2);
				t->nflags = 0;
				return t;
			}
			break;
		}

	return syn3(p1, p2);
}
예제 #2
0
파일: sh.c 프로젝트: Ju2ender/c-e
/* 
 * syn2 
 *        syn3 
 *        syn3 | syn2 
 * 
 * syn2负责构建管道线节点,搜索管道线符号, 
 * 自顶向下生成左子树,递归生成右子树。 
 * p1指向token列表头部,p2指向token列表末尾的下一个。 
 */ 
int *syn2(char **p1, char **p2) 
{ 
        char **p; 
        int l, *t; 

        l = 0; 
        for(p=p1; p!=p2; p++) 
        switch(**p) { 

        case '(': 
                l++; 
                continue;        /* 此处等同于break */ 

        case ')': 
                l--; 
                continue; 

        case '|': 
        case '^': 
                if(l == 0) { /* 没有圆括弧嵌套 */
                        t = tree(4); 
                        t[DTYP] = TFIL;        /* 建立管道线节点*/ 
                        t[DLEF] = (int)syn3(p1, p);        /* 左边列表递进一层生成左子树节点*/ 
                        t[DRIT] = (int)syn2(p+1, p2);        /* 右边递归生成右子树节点*/ 
                        t[DFLG] = 0;        /* 标志位继承自上层节点*/ 
                        return(t); 
                } 
        } 
        return(syn3(p1, p2));        /* 没有找到管道线,所有列表递进一层,不需要判断嵌套是否归零*/ 
} 
예제 #3
0
/*
 * syn2
 *	syn3
 *	syn3 | syn2
 *	syn3 |& syn2
 */
static struct command *
syn2(struct wordent *p1, struct wordent *p2, int flags)
{
    struct wordent *p, *pn;
    struct command *t;
    int f, l;

    l = 0;
    for (p = p1; p != p2; p = p->next)
	switch (p->word[0]) {
	case '(':
	    l++;
	    continue;
	case ')':
	    l--;
	    continue;
	case '|':
	    if (l != 0)
		continue;
	    t = (struct command *)xcalloc(1, sizeof(*t));
	    f = flags | POUT;
	    pn = p->next;
	    if (pn != p2 && pn->word[0] == '&') {
		f |= PERR;
		t->t_dflg |= F_STDERR;
	    }
	    t->t_dtyp = NODE_PIPE;
	    t->t_dcar = syn3(p1, p, f);
	    if (pn != p2 && pn->word[0] == '&')
		p = pn;
	    t->t_dcdr = syn2(p->next, p2, flags | PIN);
	    return (t);
	}
    return (syn3(p1, p2, flags));
}