X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/916708d59e02812675ce2d85597b7e1f2d677213..ee42c6166b14ae855c6c1ffc100d5aead31175e2:/src/parse-gram.y diff --git a/src/parse-gram.y b/src/parse-gram.y index 606ec569..0f81bf18 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -1,6 +1,6 @@ -/* Bison Grammar Parser -*- C -*- +%{/* Bison Grammar Parser -*- C -*- - Copyright (C) 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -20,16 +20,6 @@ 02111-1307 USA */ - -%debug -%defines -%locations -%pure-parser -// %error-verbose -%defines -%name-prefix="gram_" - -%{ #include "system.h" #include "complain.h" @@ -42,9 +32,6 @@ #include "reader.h" #include "symlist.h" -/* Produce verbose syntax errors. */ -#define YYERROR_VERBOSE 1 - #define YYLLOC_DEFAULT(Current, Rhs, N) (Current) = lloc_default (Rhs, N) static YYLTYPE lloc_default (YYLTYPE const *, int); @@ -69,6 +56,22 @@ assoc current_assoc; int current_prec = 0; %} +%debug +%defines +%locations +%pure-parser +%error-verbose +%defines +%name-prefix="gram_" + +%initial-action +{ + /* Bison's grammar can initial empty locations, hence a default + location is needed. */ + @$.start.file = @$.end.file = current_file; + @$.start.line = @$.end.line = 1; + @$.start.column = @$.end.column = 0; +} /* Only NUMBERS have a value. */ %union @@ -109,26 +112,31 @@ int current_prec = 0; `----------------------*/ %token - PERCENT_DEBUG "%debug" - PERCENT_DEFINE "%define" - PERCENT_DEFINES "%defines" - PERCENT_ERROR_VERBOSE "%error-verbose" - PERCENT_EXPECT "%expect" - PERCENT_FILE_PREFIX "%file-prefix" - PERCENT_GLR_PARSER "%glr-parser" - PERCENT_LEX_PARAM "%lex-param {...}" - PERCENT_LOCATIONS "%locations" - PERCENT_NAME_PREFIX "%name-prefix" - PERCENT_NO_LINES "%no-lines" - PERCENT_NONDETERMINISTIC_PARSER "%nondeterministic-parser" - PERCENT_OUTPUT "%output" - PERCENT_PARSE_PARAM "%parse-param {...}" - PERCENT_PURE_PARSER "%pure-parser" - PERCENT_SKELETON "%skeleton" - PERCENT_START "%start" - PERCENT_TOKEN_TABLE "%token-table" - PERCENT_VERBOSE "%verbose" - PERCENT_YACC "%yacc" + PERCENT_DEBUG "%debug" + PERCENT_DEFAULT_PREC "%default-prec" + PERCENT_DEFINE "%define" + PERCENT_DEFINES "%defines" + PERCENT_ERROR_VERBOSE "%error-verbose" + PERCENT_EXPECT "%expect" + PERCENT_EXPECT_RR "%expect-rr" + PERCENT_FILE_PREFIX "%file-prefix" + PERCENT_GLR_PARSER "%glr-parser" + PERCENT_INITIAL_ACTION "%initial-action {...}" + PERCENT_LEX_PARAM "%lex-param {...}" + PERCENT_LOCATIONS "%locations" + PERCENT_NAME_PREFIX "%name-prefix" + PERCENT_NO_DEFAULT_PREC "%no-default-prec" + PERCENT_NO_LINES "%no-lines" + PERCENT_NONDETERMINISTIC_PARSER + "%nondeterministic-parser" + PERCENT_OUTPUT "%output" + PERCENT_PARSE_PARAM "%parse-param {...}" + PERCENT_PURE_PARSER "%pure-parser" + PERCENT_SKELETON "%skeleton" + PERCENT_START "%start" + PERCENT_TOKEN_TABLE "%token-table" + PERCENT_VERBOSE "%verbose" + PERCENT_YACC "%yacc" ; %token TYPE "type" @@ -145,6 +153,7 @@ int current_prec = 0; %type STRING string_content "%destructor {...}" + "%initial-action {...}" "%lex-param {...}" "%parse-param {...}" "%printer {...}" @@ -175,27 +184,35 @@ declarations: declaration: grammar_declaration | PROLOGUE { prologue_augment ($1, @1); } -| "%debug" { debug_flag = 1; } +| "%debug" { debug_flag = true; } | "%define" string_content string_content { muscle_insert ($2, $3); } -| "%defines" { defines_flag = 1; } -| "%error-verbose" { error_verbose = 1; } -| "%expect" INT { expected_conflicts = $2; } +| "%defines" { defines_flag = true; } +| "%error-verbose" { error_verbose = true; } +| "%expect" INT { expected_sr_conflicts = $2; } +| "%expect-rr" INT { expected_rr_conflicts = $2; } | "%file-prefix" "=" string_content { spec_file_prefix = $3; } -| "%glr-parser" { nondeterministic_parser = true; - glr_parser = true; } +| "%glr-parser" + { + nondeterministic_parser = true; + glr_parser = true; + } +| "%initial-action {...}" + { + muscle_code_grow ("initial_action", $1, @1); + } | "%lex-param {...}" { add_param ("lex_param", $1, @1); } -| "%locations" { locations_flag = 1; } +| "%locations" { locations_flag = true; } | "%name-prefix" "=" string_content { spec_name_prefix = $3; } -| "%no-lines" { no_lines_flag = 1; } +| "%no-lines" { no_lines_flag = true; } | "%nondeterministic-parser" { nondeterministic_parser = true; } | "%output" "=" string_content { spec_outfile = $3; } -| "%parse-param {...}" { add_param ("parse_param", $1, @1); } +| "%parse-param {...}" { add_param ("parse_param", $1, @1); } | "%pure-parser" { pure_parser = true; } | "%skeleton" string_content { skeleton = $2; } -| "%token-table" { token_table_flag = 1; } +| "%token-table" { token_table_flag = true; } | "%verbose" { report_flag = report_states; } -| "%yacc" { yacc_flag = 1; } -| ";" +| "%yacc" { yacc_flag = true; } +| /*FIXME: Err? What is this horror doing here? */ ";" ; grammar_declaration: @@ -207,7 +224,7 @@ grammar_declaration: } | "%union {...}" { - typed = 1; + typed = true; MUSCLE_INSERT_INT ("stype_line", @1.start.line); muscle_insert ("stype", $1); } @@ -225,6 +242,14 @@ grammar_declaration: symbol_printer_set (list->sym, $1, list->location); symbol_list_free ($2); } +| "%default-prec" + { + default_prec = true; + } +| "%no-default-prec" + { + default_prec = false; + } ; symbol_declaration: @@ -332,7 +357,7 @@ grammar: body of the grammar. */ rules_or_grammar_declaration: rules -| grammar_declaration +| grammar_declaration ";" { if (yacc_flag) complain_at (@$, _("POSIX forbids declarations in the grammar")); @@ -341,7 +366,6 @@ rules_or_grammar_declaration: { yyerrok; } -| ";" ; rules: @@ -351,6 +375,7 @@ rules: rhses.1: rhs { grammar_rule_end (@1); } | rhses.1 "|" rhs { grammar_rule_end (@3); } +| rhses.1 ";" ; rhs: @@ -400,7 +425,7 @@ epilogue.opt: /* Nothing. */ | "%%" EPILOGUE { - epilogue_augment ($2, @2); + muscle_code_grow ("epilogue", $2, @2); scanner_last_string_free (); } ; @@ -418,7 +443,11 @@ lloc_default (YYLTYPE const *rhs, int n) { int i; YYLTYPE loc; - loc.start = loc.end = rhs[n].end; + + /* SGI MIPSpro 7.4.1m miscompiles "loc.start = loc.end = rhs[n].end;". + The bug is fixed in 7.4.2m, but play it safe for now. */ + loc.start = rhs[n].end; + loc.end = rhs[n].end; /* Ignore empty nonterminals the start of the the right-hand side. Do not bother to ignore them at the end of the right-hand side,