[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
11-byacc-reports.patch
From: |
Akim Demaille |
Subject: |
11-byacc-reports.patch |
Date: |
Sat, 15 Jun 2002 20:19:32 +0200 |
Index: ChangeLog
from Akim Demaille <address@hidden>
Copy BYacc's nice way to report the grammar.
* src/gram.h, src/gram.c (grammar_rhs_print, grammar_rules_print):
New.
Don't print the rules' location, it is confusing and useless.
(rule_print): Use grammar_rhs_print.
* src/print.c (print_grammar): Use grammar_rules_print.
Index: src/gram.c
--- src/gram.c Sat, 15 Jun 2002 15:50:16 +0200 akim
+++ src/gram.c Sat, 15 Jun 2002 16:11:06 +0200 akim
@@ -61,14 +61,13 @@
}
-/*-------------------------.
-| Print this RULE on OUT. |
-`-------------------------*/
+/*-------------------------------.
+| Print this RULE's RHS on OUT. |
+`-------------------------------*/
void
-rule_print (rule_t *rule, FILE *out)
+rule_rhs_print (rule_t *rule, FILE *out)
{
- fprintf (out, "%s:", symbol_tag_get (rule->lhs));
if (*rule->rhs >= 0)
{
item_number_t *r;
@@ -83,6 +82,18 @@
}
+/*-------------------------.
+| Print this RULE on OUT. |
+`-------------------------*/
+
+void
+rule_print (rule_t *rule, FILE *out)
+{
+ fprintf (out, "%s:", symbol_tag_get (rule->lhs));
+ rule_rhs_print (rule, out);
+}
+
+
/*------------------------.
| Dump RITEM for traces. |
`------------------------*/
@@ -121,6 +132,46 @@
return max;
}
+
+/*-----------------------------------.
+| Print the grammar's rules on OUT. |
+`-----------------------------------*/
+
+static inline void
+blanks_print (unsigned n, FILE *out)
+{
+ for (/* Nothing*/; n > 0; --n)
+ fputc (' ', out);
+}
+
+void
+grammar_rules_print (FILE *out)
+{
+ int r;
+ symbol_t *last_lhs = NULL;
+
+ /* rule # : LHS -> RHS */
+ fprintf (out, "%s\n\n", _("Grammar"));
+ for (r = 1; r < nrules + 1; r++)
+ {
+ if (last_lhs && last_lhs != rules[r].lhs)
+ fputc ('\n', out);
+
+ fprintf (out, " %3d ", r - 1);
+ if (last_lhs != rules[r].lhs)
+ {
+ last_lhs = rules[r].lhs;
+ fprintf (out, "%s:", symbol_tag_get (last_lhs));
+ }
+ else
+ {
+ blanks_print (strlen (symbol_tag_get (last_lhs)), out);
+ fputc ('|', out);
+ }
+ rule_rhs_print (&rules[r], out);
+ }
+ fputs ("\n\n", out);
+}
/*-------------------.
| Dump the grammar. |
Index: src/gram.h
--- src/gram.h Sat, 15 Jun 2002 15:39:16 +0200 akim
+++ src/gram.h Sat, 15 Jun 2002 16:00:02 +0200 akim
@@ -171,6 +171,9 @@
/* Return the length of the RHS. */
int rule_rhs_length PARAMS ((rule_t *rule));
+/* Print this RULE's RHS on OUT. */
+void rule_rhs_print PARAMS ((rule_t *rule, FILE *out));
+
/* Print this RULE on OUT. */
void rule_print PARAMS ((rule_t *rule, FILE *out));
@@ -180,6 +183,8 @@
/* Return the size of the longest rule RHS. */
size_t ritem_longest_rhs PARAMS ((void));
+/* Print the grammar's rules on OUT. */
+void grammar_rules_print PARAMS ((FILE *out));
/* Dump the grammar. */
void grammar_dump PARAMS ((FILE *out, const char *title));
Index: src/print.c
--- src/print.c Sat, 15 Jun 2002 15:39:16 +0200 akim
+++ src/print.c Sat, 15 Jun 2002 16:12:57 +0200 akim
@@ -375,21 +375,11 @@
print_grammar (FILE *out)
{
symbol_number_t i;
- int j;
item_number_t *rule;
char buffer[90];
int column = 0;
- /* rule # : LHS -> RHS */
- fprintf (out, "%s\n\n", _("Grammar"));
- fprintf (out, " %s\n", _("Number, Line, Rule"));
- for (j = 1; j < nrules + 1; j++)
- {
- fprintf (out, " %3d %3d ", j - 1, rules[j].location.first_line);
- rule_print (&rules[j], out);
- }
- fputs ("\n\n", out);
-
+ grammar_rules_print (out);
/* TERMINAL (type #) : rule #s terminal is on RHS */
fprintf (out, "%s\n\n", _("Terminals, with rules where they appear"));
@@ -397,18 +387,19 @@
if (token_translations[i] != undeftoken->number)
{
const char *tag = symbol_tag_get (symbols[token_translations[i]]);
+ int r;
buffer[0] = 0;
column = strlen (tag);
fputs (tag, out);
END_TEST (50);
sprintf (buffer, " (%d)", i);
- for (j = 1; j < nrules + 1; j++)
- for (rule = rules[j].rhs; *rule >= 0; rule++)
+ for (r = 1; r < nrules + 1; r++)
+ for (rule = rules[r].rhs; *rule >= 0; rule++)
if (item_number_as_symbol_number (*rule) == token_translations[i])
{
END_TEST (65);
- sprintf (buffer + strlen (buffer), " %d", j - 1);
+ sprintf (buffer + strlen (buffer), " %d", r - 1);
break;
}
fprintf (out, "%s\n", buffer);
@@ -420,13 +411,14 @@
for (i = ntokens; i < nsyms; i++)
{
int left_count = 0, right_count = 0;
+ int r;
const char *tag = symbol_tag_get (symbols[i]);
- for (j = 1; j < nrules + 1; j++)
+ for (r = 1; r < nrules + 1; r++)
{
- if (rules[j].lhs->number == i)
+ if (rules[r].lhs->number == i)
left_count++;
- for (rule = rules[j].rhs; *rule >= 0; rule++)
+ for (rule = rules[r].rhs; *rule >= 0; rule++)
if (item_number_as_symbol_number (*rule) == i)
{
right_count++;
@@ -445,11 +437,11 @@
END_TEST (50);
sprintf (buffer + strlen (buffer), _(" on left:"));
- for (j = 1; j < nrules + 1; j++)
+ for (r = 1; r < nrules + 1; r++)
{
END_TEST (65);
- if (rules[j].lhs->number == i)
- sprintf (buffer + strlen (buffer), " %d", j - 1);
+ if (rules[r].lhs->number == i)
+ sprintf (buffer + strlen (buffer), " %d", r - 1);
}
}
@@ -459,13 +451,13 @@
sprintf (buffer + strlen (buffer), ",");
END_TEST (50);
sprintf (buffer + strlen (buffer), _(" on right:"));
- for (j = 1; j < nrules + 1; j++)
+ for (r = 1; r < nrules + 1; r++)
{
- for (rule = rules[j].rhs; *rule >= 0; rule++)
+ for (rule = rules[r].rhs; *rule >= 0; rule++)
if (item_number_as_symbol_number (*rule) == i)
{
END_TEST (65);
- sprintf (buffer + strlen (buffer), " %d", j - 1);
+ sprintf (buffer + strlen (buffer), " %d", r - 1);
break;
}
}
Index: tests/conflicts.at
--- tests/conflicts.at Sat, 15 Jun 2002 15:39:16 +0200 akim
+++ tests/conflicts.at Sat, 15 Jun 2002 16:20:13 +0200 akim
@@ -130,6 +130,8 @@ expr: expr '<' expr
AT_SETUP([Unresolved SR Conflicts])
+AT_KEYWORDS([report])
+
AT_DATA([input.y],
[[%token NUM OP
%%
@@ -147,10 +149,10 @@ exp: exp OP exp | NUM;
Grammar
- Number, Line, Rule
- 0 3 $axiom: exp $
- 1 3 exp: exp OP exp
- 2 3 exp: NUM
+ 0 $axiom: exp $
+
+ 1 exp: exp OP exp
+ 2 | NUM
Terminals, with rules where they appear
@@ -241,6 +243,8 @@ exp: exp OP exp | NUM;
AT_SETUP([Solved SR Conflicts])
+AT_KEYWORDS([report])
+
AT_DATA([input.y],
[[%token NUM OP
%right OP
@@ -254,10 +258,10 @@ exp: exp OP exp | NUM;
AT_CHECK([cat input.output], [],
[[Grammar
- Number, Line, Rule
- 0 4 $axiom: exp $
- 1 4 exp: exp OP exp
- 2 4 exp: NUM
+ 0 $axiom: exp $
+
+ 1 exp: exp OP exp
+ 2 | NUM
Terminals, with rules where they appear
Index: tests/regression.at
--- tests/regression.at Sat, 15 Jun 2002 15:39:16 +0200 akim
+++ tests/regression.at Sat, 15 Jun 2002 16:19:16 +0200 akim
@@ -112,6 +112,8 @@ exp: '(' exp ')' | NUM ;
AT_SETUP([Rule Line Numbers])
+AT_KEYWORDS([report])
+
AT_DATA([input.y],
[[%%
expr:
@@ -148,12 +150,15 @@ expr:
AT_CHECK([cat input.output], [],
[[Grammar
- Number, Line, Rule
- 0 5 $axiom: expr $
- 1 5 @1: /* empty */
- 2 2 expr: 'a' @1 'b'
- 3 18 @2: /* empty */
- 4 15 expr: @2 'c'
+ 0 $axiom: expr $
+
+ 1 @1: /* empty */
+
+ 2 expr: 'a' @1 'b'
+
+ 3 @2: /* empty */
+
+ 4 expr: @2 'c'
Terminals, with rules where they appear
@@ -349,6 +354,8 @@ exp: "a";
AT_SETUP([Web2c Report])
+AT_KEYWORDS([report])
+
AT_DATA([input.y],
[[%token undef_id_tok const_id_tok
@@ -375,13 +382,12 @@ exp: "a";
AT_CHECK([sed -n 's/ *$//;/^$/!p' input.output], 0,
[[Grammar
- Number, Line, Rule
- 0 6 $axiom: CONST_DEC_PART $
- 1 6 CONST_DEC_PART: CONST_DEC_LIST
- 2 10 CONST_DEC_LIST: CONST_DEC
- 3 12 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC
- 4 16 @1: /* empty */
- 5 15 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';'
+ 0 $axiom: CONST_DEC_PART $
+ 1 CONST_DEC_PART: CONST_DEC_LIST
+ 2 CONST_DEC_LIST: CONST_DEC
+ 3 | CONST_DEC_LIST CONST_DEC
+ 4 @1: /* empty */
+ 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';'
Terminals, with rules where they appear
$ (0) 0
';' (59) 5
@@ -469,6 +475,8 @@ exp: "a";
AT_SETUP([Web2c Actions])
+
+AT_KEYWORDS([report])
AT_DATA([input.y],
[[%%
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- 11-byacc-reports.patch,
Akim Demaille <=