Esempio n. 1
0
RegExp *ranToRE( SubStr s )
{
    Range   *r;

    s.len -= 2; s.str += 1;
    if( s.len == 0 )
        return( RegExp_new_NullOp() );
    r = getRange( &s );
    while( s.len > 0 )
        r = doUnion( r, getRange( &s ) );
    return( RegExp_new_MatchOp( r ) );
}
Esempio n. 2
0
RegExp *strToRE( SubStr s )
{
    RegExp  *re;

    s.len -= 2; s.str += 1;
    if( s.len == 0 )
        return( RegExp_new_NullOp() );
    re = matchChar( unescape( &s ) );
    while( s.len > 0 )
        re = RegExp_new_CatOp( re, matchChar( unescape( &s ) ) );
    return( re );
}
Esempio n. 3
0
RegExp *mkDiff( RegExp *e1, RegExp *e2 )
{
    RegExp  *m1, *m2;
    Range   *r;

    if( !(m1 = RegExp_isA( e1, MATCHOP )) )
        return( NULL );
    if( !(m2 = RegExp_isA( e2, MATCHOP )) )
        return( NULL );
    r = doDiff( m1->u.MatchOp.match, m2->u.MatchOp.match );
    return( r ? RegExp_new_MatchOp( r ) : RegExp_new_NullOp() );
}
Esempio n. 4
0
static RegExp *
parse_factor(void)
{
    RegExp *e;
    char ch;
    e = parse_primary();
    while (curtok == CLOSE || curtok == CLOSESIZE) {
	switch (curtok) {
	    case CLOSE:
		ch = yylval.op;
		while (get_next_token() == CLOSE) {
		    if (ch != yylval.op)
			ch = '*';
		}
		switch (ch) {
		    case '*':
			e = mkAlt(RegExp_new_CloseOp(e), RegExp_new_NullOp());
			break;
		    case '+':
			e = RegExp_new_CloseOp(e);
			break;
		    case '?':
			e = mkAlt(e, RegExp_new_NullOp());
			break;
		}
		break;
	    case CLOSESIZE:
		e = RegExp_new_CloseVOp(e, yylval.extop.minsize,
					yylval.extop.maxsize);
		get_next_token();	/* CLOSESIZE */
		break;
	    default:
		Scanner_fatal(in, "parse error");
		break;
	}
    }
    return e;
}
Esempio n. 5
0
static void
yyparse(void)
{
    RegExp *re, *look;

    accept = 0;
    spec = NULL;
    get_next_token();
    while (curtok != 0) {
	switch (curtok) {
	    case ID:
		get_peek_token();
		if (peektok == '=') {
		    /* ID = expr; */
		    Symbol *sym = yylval.symbol;
		    get_next_token(); /* id */
		    get_next_token(); /* = */
		    re = parse_expr();
		    if (curtok != ';')
			Scanner_fatal(in, "missing `;' after regexp");
		    get_next_token(); /* ; */
		    if (sym->re)
			Scanner_fatal(in, "sym already defined");
		    sym->re = re;
		    break;
		}
		/*@fallthrough@*/
	    default:
		/* rule: expr [/ expr] CODE */
		re = parse_expr();
		if (!re)
		    Scanner_fatal(in, "expression syntax error");

		if (curtok == '/') {
		    get_next_token(); /* / */
		    look = parse_expr();
		} else
		    look = RegExp_new_NullOp();

		if (curtok != CODE)
		    Scanner_fatal(in, "missing code after regexp");
		re = RegExp_new_RuleOp(re, look, yylval.token, accept++);
		get_next_token(); /* CODE */
		spec = spec ? mkAlt(spec, re) : re;
	}
    }
}