X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/e9ce56889c73b46052abd2ed2198d5c436cf5852..1f916a78e6af829d8c2a8ec982f45aa7a30a9af5:/src/parse-gram.y diff --git a/src/parse-gram.y b/src/parse-gram.y index 2224c85f..e7718945 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -1,5 +1,6 @@ /* Bison Grammar Parser -*- C -*- - Copyright (C) 2002 Free Software Foundation, Inc. + + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -24,7 +25,7 @@ %defines %locations %pure-parser -// %error-verbose +%error-verbose %defines %name-prefix="gram_" @@ -41,9 +42,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); @@ -68,6 +66,14 @@ assoc current_assoc; int current_prec = 0; %} +%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 @@ -108,25 +114,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_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" @@ -143,6 +155,7 @@ int current_prec = 0; %type STRING string_content "%destructor {...}" + "%initial-action {...}" "%lex-param {...}" "%parse-param {...}" "%printer {...}" @@ -173,25 +186,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" { glr_parser = 1; } +| "%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); } -| "%pure-parser" { pure_parser = 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; } -| "%verbose" { report_flag = 1; } -| "%yacc" { yacc_flag = 1; } -| ";" +| "%token-table" { token_table_flag = true; } +| "%verbose" { report_flag = report_states; } +| "%yacc" { yacc_flag = true; } +| /*FIXME: Err? What is this horror doing here? */ ";" ; grammar_declaration: @@ -203,7 +226,7 @@ grammar_declaration: } | "%union {...}" { - typed = 1; + typed = true; MUSCLE_INSERT_INT ("stype_line", @1.start.line); muscle_insert ("stype", $1); } @@ -221,6 +244,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: @@ -328,7 +359,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")); @@ -337,7 +368,6 @@ rules_or_grammar_declaration: { yyerrok; } -| ";" ; rules: @@ -347,6 +377,7 @@ rules: rhses.1: rhs { grammar_rule_end (@1); } | rhses.1 "|" rhs { grammar_rule_end (@3); } +| rhses.1 ";" ; rhs: @@ -396,7 +427,7 @@ epilogue.opt: /* Nothing. */ | "%%" EPILOGUE { - epilogue_augment ($2, @2); + muscle_code_grow ("epilogue", $2, @2); scanner_last_string_free (); } ; @@ -413,24 +444,20 @@ static YYLTYPE lloc_default (YYLTYPE const *rhs, int n) { int i; - int j; - YYLTYPE r; - r.start = r.end = rhs[n].end; + YYLTYPE loc; + loc.start = 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, + since empty nonterminals have the same end as their predecessors. */ for (i = 1; i <= n; i++) if (! equal_boundaries (rhs[i].start, rhs[i].end)) { - r.start = rhs[i].start; - - for (j = n; i < j; j--) - if (! equal_boundaries (rhs[j].start, rhs[j].end)) - break; - r.end = rhs[j].end; - + loc.start = rhs[i].start; break; } - return r; + return loc; }