X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/a737b2163c275761f32589bf7c249016452bb730..0ced3098fd97e1483b4ac938bdce99bfc7942539:/src/parse-gram.y diff --git a/src/parse-gram.y b/src/parse-gram.y index 668d9db3..eb9c9709 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -25,7 +25,7 @@ %defines %locations %pure-parser -// %error-verbose +%error-verbose %defines %name-prefix="gram_" @@ -42,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); @@ -69,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 @@ -109,25 +114,30 @@ 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_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" @@ -144,6 +154,7 @@ int current_prec = 0; %type STRING string_content "%destructor {...}" + "%initial-action {...}" "%lex-param {...}" "%parse-param {...}" "%printer {...}" @@ -174,25 +185,34 @@ 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; } +| "%defines" { defines_flag = true; } +| "%error-verbose" { error_verbose = true; } | "%expect" INT { expected_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; } +| "%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: @@ -204,7 +224,7 @@ grammar_declaration: } | "%union {...}" { - typed = 1; + typed = true; MUSCLE_INSERT_INT ("stype_line", @1.start.line); muscle_insert ("stype", $1); } @@ -222,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: @@ -329,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")); @@ -338,7 +366,6 @@ rules_or_grammar_declaration: { yyerrok; } -| ";" ; rules: @@ -348,6 +375,7 @@ rules: rhses.1: rhs { grammar_rule_end (@1); } | rhses.1 "|" rhs { grammar_rule_end (@3); } +| rhses.1 ";" ; rhs: @@ -397,7 +425,7 @@ epilogue.opt: /* Nothing. */ | "%%" EPILOGUE { - epilogue_augment ($2, @2); + muscle_code_grow ("epilogue", $2, @2); scanner_last_string_free (); } ;