Add an -e option to ocamlyacc to reject grammars with conflicts.

master
Jeremy Yallop 2016-05-31 20:20:46 +01:00
parent f54c38ba0c
commit 54065bb1d0
4 changed files with 21 additions and 2 deletions

View File

@ -210,6 +210,7 @@ extern char tflag;
extern char vflag;
extern char qflag;
extern char sflag;
extern char eflag;
extern char big_endian;
extern char *myname;
@ -335,6 +336,7 @@ extern void output (void);
extern void over_unionized (char *u_cptr) Noreturn;
extern void prec_redeclared (void);
extern void polymorphic_entry_point(char *s) Noreturn;
extern void forbidden_conflicts (void);
extern void reader (void);
extern void reflexive_transitive_closure (unsigned int *R, int n);
extern void reprec_warning (char *s);

View File

@ -313,3 +313,11 @@ void polymorphic_entry_point(char *s)
myname, s);
done(1);
}
void forbidden_conflicts(void)
{
fprintf(stderr,
"%s: the grammar has conflicts, but -e was specified\n",
myname);
done(1);
}

View File

@ -30,6 +30,7 @@ char rflag;
char tflag;
char vflag;
char qflag;
char eflag;
char sflag;
char big_endian;
@ -160,7 +161,7 @@ void set_signals(void)
void usage(void)
{
fprintf(stderr, "usage: %s [-v] [-q] [-b file_prefix] filename\n",
fprintf(stderr, "usage: %s [-v] [-e] [-q] [-b file_prefix] filename\n",
myname);
exit(1);
}
@ -213,6 +214,10 @@ void getargs(int argc, char **argv)
usage();
continue;
case 'e':
eflag = 1;
continue;
default:
usage();
}

View File

@ -47,7 +47,11 @@ void make_parser(void)
find_final_state();
remove_conflicts();
unused_rules();
if (SRtotal + RRtotal > 0) total_conflicts();
if (SRtotal + RRtotal > 0) {
total_conflicts();
if (eflag)
forbidden_conflicts();
}
defreds();
}