[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
02-grammar-rule-begin.patch
From: |
Akim Demaille |
Subject: |
02-grammar-rule-begin.patch |
Date: |
Tue, 11 Jun 2002 10:05:49 +0200 |
Index: ChangeLog
from Akim Demaille <address@hidden>
* src/reader.c (grammar_rule_begin, previous_rule, current_rule):
New.
(readgram): Use them as replacement of inlined code, crule and
crule1.
Index: src/reader.c
--- src/reader.c Mon, 10 Jun 2002 21:27:55 +0200 akim (bison/b/5_reader.c
1.77.1.3.1.18.1.7.1.1 664)
+++ src/reader.c Mon, 10 Jun 2002 21:35:36 +0200 akim (bison/b/5_reader.c
1.77.1.3.1.18.1.7.1.1 664)
@@ -1089,18 +1089,49 @@
grammar_end = p;
}
+/* The rule currently being defined, and the previous rule. Point to
+ the first symbol of each list: their lhs. */
+symbol_list *current_rule = NULL;
+symbol_list *previous_rule = NULL;
+
+
+/* Create a new rule for LHS in to the GRAMMAR. */
+
+static void
+grammar_rule_begin (symbol_t *lhs)
+{
+ if (!start_flag)
+ {
+ startsymbol = lhs;
+ start_flag = 1;
+ }
+
+ /* Start a new rule and record its lhs. */
+ ++nrules;
+ ++nritems;
+
+ previous_rule = grammar_end;
+ grammar_symbol_append (lhs);
+ current_rule = grammar_end;
+
+ /* Mark the rule's lhs as a nonterminal if not already so. */
+
+ if (lhs->class == unknown_sym)
+ {
+ lhs->class = nterm_sym;
+ lhs->number = nvars;
+ ++nvars;
+ }
+ else if (lhs->class == token_sym)
+ complain (_("rule given for %s, which is a token"), lhs->tag);
+}
+
static void
readgram (void)
{
token_t t;
symbol_t *lhs = NULL;
- /* Points to first symbol_list of current rule. its symbol is the
- lhs of the rule. */
- symbol_list *crule = NULL;
- /* Points to the symbol_list preceding crule. */
- symbol_list *crule1 = NULL;
-
t = lex ();
while (t != tok_two_percents && t != tok_eof)
@@ -1116,12 +1147,6 @@
{
lhs = symval;
- if (!start_flag)
- {
- startsymbol = lhs;
- start_flag = 1;
- }
-
t = lex ();
if (t != tok_colon)
{
@@ -1129,32 +1154,13 @@
unlex (t);
}
}
-
if (nrules == 0 && t == tok_bar)
{
complain (_("grammar starts with vertical bar"));
lhs = symval; /* BOGUS: use a random symval */
}
- /* start a new rule and record its lhs. */
-
- ++nrules;
- ++nritems;
-
- crule1 = grammar_end;
- grammar_symbol_append (lhs);
- crule = grammar_end;
-
- /* mark the rule's lhs as a nonterminal if not already so. */
-
- if (lhs->class == unknown_sym)
- {
- lhs->class = nterm_sym;
- lhs->number = nvars;
- ++nvars;
- }
- else if (lhs->class == token_sym)
- complain (_("rule given for %s, which is a token"), lhs->tag);
+ grammar_rule_begin (lhs);
/* read the rhs of the rule. */
for (;;)
@@ -1163,7 +1169,7 @@
if (t == tok_prec)
{
t = lex ();
- crule->ruleprec = symval;
+ current_rule->ruleprec = symval;
t = lex ();
}
@@ -1212,21 +1218,21 @@
++nrules;
++nritems;
/* Attach its lineno to that of the host rule. */
- p->line = crule->line;
+ p->line = current_rule->line;
/* Move the action from the host rule to this one. */
- p->action = crule->action;
- p->action_line = crule->action_line;
- crule->action = NULL;
+ p->action = current_rule->action;
+ p->action_line = current_rule->action_line;
+ current_rule->action = NULL;
- if (crule1)
- crule1->next = p;
+ if (previous_rule)
+ previous_rule->next = p;
else
grammar = p;
/* End of the rule. */
- crule1 = symbol_list_new (NULL);
- crule1->next = crule;
+ previous_rule = symbol_list_new (NULL);
+ previous_rule->next = current_rule;
- p->next = crule1;
+ p->next = previous_rule;
/* Insert the dummy generated by that rule into this
rule. */
@@ -1242,7 +1248,7 @@
}
else /* handle an action. */
{
- parse_action (crule, rulelength);
+ parse_action (current_rule, rulelength);
action_flag = 1;
++xactions; /* JF */
}
@@ -1256,7 +1262,7 @@
{
complain (_("two @prec's in a row"));
t = lex ();
- crule->ruleprec = symval;
+ current_rule->ruleprec = symval;
t = lex ();
}
@@ -1265,7 +1271,7 @@
/* This case never occurs -wjh */
if (action_flag)
complain (_("two actions at end of one rule"));
- parse_action (crule, rulelength);
+ parse_action (current_rule, rulelength);
action_flag = 1;
++xactions; /* -wjh */
t = lex ();
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- 02-grammar-rule-begin.patch,
Akim Demaille <=