Skip to content

Commit 54065bb

Browse files
committed
Add an -e option to ocamlyacc to reject grammars with conflicts.
1 parent f54c38b commit 54065bb

File tree

4 files changed

+21
-2
lines changed

4 files changed

+21
-2
lines changed

yacc/defs.h

+2
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ extern char tflag;
210210
extern char vflag;
211211
extern char qflag;
212212
extern char sflag;
213+
extern char eflag;
213214
extern char big_endian;
214215

215216
extern char *myname;
@@ -335,6 +336,7 @@ extern void output (void);
335336
extern void over_unionized (char *u_cptr) Noreturn;
336337
extern void prec_redeclared (void);
337338
extern void polymorphic_entry_point(char *s) Noreturn;
339+
extern void forbidden_conflicts (void);
338340
extern void reader (void);
339341
extern void reflexive_transitive_closure (unsigned int *R, int n);
340342
extern void reprec_warning (char *s);

yacc/error.c

+8
Original file line numberDiff line numberDiff line change
@@ -313,3 +313,11 @@ void polymorphic_entry_point(char *s)
313313
myname, s);
314314
done(1);
315315
}
316+
317+
void forbidden_conflicts(void)
318+
{
319+
fprintf(stderr,
320+
"%s: the grammar has conflicts, but -e was specified\n",
321+
myname);
322+
done(1);
323+
}

yacc/main.c

+6-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ char rflag;
3030
char tflag;
3131
char vflag;
3232
char qflag;
33+
char eflag;
3334
char sflag;
3435
char big_endian;
3536

@@ -160,7 +161,7 @@ void set_signals(void)
160161

161162
void usage(void)
162163
{
163-
fprintf(stderr, "usage: %s [-v] [-q] [-b file_prefix] filename\n",
164+
fprintf(stderr, "usage: %s [-v] [-e] [-q] [-b file_prefix] filename\n",
164165
myname);
165166
exit(1);
166167
}
@@ -213,6 +214,10 @@ void getargs(int argc, char **argv)
213214
usage();
214215
continue;
215216

217+
case 'e':
218+
eflag = 1;
219+
continue;
220+
216221
default:
217222
usage();
218223
}

yacc/mkpar.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@ void make_parser(void)
4747
find_final_state();
4848
remove_conflicts();
4949
unused_rules();
50-
if (SRtotal + RRtotal > 0) total_conflicts();
50+
if (SRtotal + RRtotal > 0) {
51+
total_conflicts();
52+
if (eflag)
53+
forbidden_conflicts();
54+
}
5155
defreds();
5256
}
5357

0 commit comments

Comments
 (0)