X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=dfa%2Fdfa.c;h=0a610934f0c38326e92231fd5546062373006a23;hb=e39158d4c6147865c129d2524f1b910e4e7921ed;hp=45e2493be3f2b8c6b62adf879195df5273779475;hpb=a825e22395e14761bcb2f88177d1a86f3da2843a;p=idzebra-moved-to-github.git diff --git a/dfa/dfa.c b/dfa/dfa.c index 45e2493..0a61093 100644 --- a/dfa/dfa.c +++ b/dfa/dfa.c @@ -4,7 +4,16 @@ * Sebastian Hammer, Adam Dickmeiss * * $Log: dfa.c,v $ - * Revision 1.6 1995-10-16 09:31:25 adam + * Revision 1.9 1995-12-06 12:24:58 adam + * Removed verbatim mode code. + * + * Revision 1.8 1995/12/06 09:09:58 adam + * Work on left and right anchors. + * + * Revision 1.7 1995/11/27 09:23:02 adam + * New berbatim hook in regular expressions. "[]n ..". + * + * Revision 1.6 1995/10/16 09:31:25 adam * Bug fix. * * Revision 1.5 1995/10/02 15:17:58 adam @@ -93,7 +102,6 @@ static void add_follow (Set lastpos, Set firstpos), dfa_trav (struct Tnode *n), init_followpos (void), - mk_dfa_tran (struct DFA_states *dfas), pr_tran (struct DFA_states *dfas), pr_verbose (struct DFA_states *dfas), pr_followpos (void), @@ -228,7 +236,7 @@ static struct Tnode *expr_4 (void) break; case L_CHAR: t1 = mk_Tnode(); - t1->pos = ++(parse_info->position); + t1->pos = ++parse_info->position; t1->u.ch[1] = t1->u.ch[0] = look_ch; lex (); break; @@ -259,14 +267,12 @@ static struct Tnode *expr_4 (void) return t1; } -static void do_parse (dfap, s, cc, tnp) -struct DFA_parse *dfap; -char **s; -const unsigned short *cc; -struct Tnode **tnp; +static void do_parse (struct DFA_parse *dfap, char **s, + const unsigned short *cc, struct Tnode **tnp) { int i; - struct Tnode *t1, *t2; + int anchor_flag = 0; + struct Tnode *t1, *t2, *tn; for (i=0; cc[i]; i +=2) ; @@ -319,12 +325,44 @@ struct Tnode **tnp; inside_string = 0; lex (); + if (lookahead == L_START) + { + t2 = mk_Tnode (); + t2->pos = ++parse_info->position; + t2->u.ch[1] = t2->u.ch[0] = '\n'; + anchor_flag = 1; + lex (); + } t1 = expr_1 (); - if (t1 && lookahead == 0) + if (anchor_flag) + { + tn = mk_Tnode (); + tn->pos = CAT; + tn->u.p[0] = t2; + tn->u.p[1] = t1; + t1 = tn; + } + if (lookahead == L_END && t1) + { + t2 = mk_Tnode (); + t2->pos = ++parse_info->position; + t2->u.ch[1] = t2->u.ch[0] = '\n'; + + tn = mk_Tnode (); + tn->pos = CAT; + tn->u.p[0] = t1; + tn->u.p[1] = t2; + t1 = tn; + + anchor_flag |= 2; + lex (); + } + if (lookahead == 0 && t1) { t2 = mk_Tnode(); t2->pos = ++parse_info->position; t2->u.ch[0] = -(++parse_info->rule); + t2->u.ch[1] = anchor_flag; *tnp = mk_Tnode(); (*tnp)->pos = CAT; @@ -359,9 +397,11 @@ static int nextchar (int *esc) { case '\r': case '\n': - case '\t': case '\0': return '\\'; + case '\t': + ++expr_ptr; + return ' '; case 'n': ++expr_ptr; return '\n'; @@ -470,7 +510,7 @@ static int lex_sub(void) return read_charset(); else if (look_ch == ' ') return 0; - else + else { for (cc = ctrl_chars; *cc; cc += 2) if (*cc == look_ch)