* Sebastian Hammer, Adam Dickmeiss
*
* $Log: dfa.c,v $
- * Revision 1.4 1995-09-28 09:18:52 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
+ * Bug fix in dfa_delete.
+ *
+ * Revision 1.4 1995/09/28 09:18:52 adam
* Removed various preprocessor defines.
*
* Revision 1.3 1995/09/04 12:33:26 adam
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),
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;
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)
;
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;
{
case '\r':
case '\n':
- case '\t':
case '\0':
return '\\';
+ case '\t':
+ ++expr_ptr;
+ return ' ';
case 'n':
++expr_ptr;
return '\n';
return read_charset();
else if (look_ch == ' ')
return 0;
- else
+ else
{
for (cc = ctrl_chars; *cc; cc += 2)
if (*cc == look_ch)
{
char_0 = max_char+1;
for (pos_i = pos; (i = *pos_i) != -1; ++pos_i)
- if (posar[i]->u.ch[1] >= char_1)
- if ((c=posar[i]->u.ch[0]) < char_0)
- if (c < char_1)
- char_0 = char_1;
- else
- char_0 = c;
+ if (posar[i]->u.ch[1] >= char_1
+ && (c=posar[i]->u.ch[0]) < char_0)
+ if (c < char_1)
+ char_0 = char_1;
+ else
+ char_0 = c;
- char_1 = max_char;
if (char_0 > max_char)
break;
+
+ char_1 = max_char;
+
tran_set = mk_Set (poset);
for (pos_i = pos; (i = *pos_i) != -1; ++pos_i)
- if ((c=posar[i]->u.ch[1]) >= char_0)
- if (posar[i]->u.ch[0] <= char_0)
- {
- if (c < char_1)
- char_1 = c;
- tran_set = union_Set (poset, tran_set, followpos[i]);
- }
- else if (c <= char_1)
- char_1 = c-1;
+ {
+ if ((c=posar[i]->u.ch[0]) > char_0 && c <= char_1)
+ char_1 = c - 1; /* forward chunk */
+ else if ((c=posar[i]->u.ch[1]) >= char_0 && c < char_1)
+ char_1 = c; /* backward chunk */
+ if (posar[i]->u.ch[1] >= char_0 && posar[i]->u.ch[0] <= char_0)
+ tran_set = union_Set (poset, tran_set, followpos[i]);
+ }
if (tran_set)
{
add_DFA_state (dfas, &tran_set, &dfa_to);
assert (*dfap);
if ((*dfap)->parse_info)
rm_dfa_parse (&(*dfap)->parse_info);
- rm_DFA_states (&(*dfap)->state_info);
+ if ((*dfap)->state_info)
+ rm_DFA_states (&(*dfap)->state_info);
ifree (*dfap);
*dfap = NULL;
}