diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index a8ce22f3117..53773a9e99a 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -1443,6 +1443,7 @@ generic_set: n->name = $1; $$ = n; } + ; set_rest_more: /* Generic SET syntaxes: */ generic_set {$$ = $1;} @@ -6192,6 +6193,7 @@ attrs: '.' attr_name type_name_list: Typename { $$ = list_make1($1); } | type_name_list ',' Typename { $$ = lappend($1, $3); } + ; /***************************************************************************** * diff --git a/src/interfaces/ecpg/preproc/check_rules.pl b/src/interfaces/ecpg/preproc/check_rules.pl index e681943856b..b1501d0804e 100644 --- a/src/interfaces/ecpg/preproc/check_rules.pl +++ b/src/interfaces/ecpg/preproc/check_rules.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl # src/interfaces/ecpg/preproc/check_rules.pl -# test parser generater for ecpg -# call with backend parser as stdin +# test parser generator for ecpg +# call with backend grammar as stdin # # Copyright (c) 2009-2017, PostgreSQL Global Development Group # @@ -47,6 +47,7 @@ my %replace_line = ( my $block = ''; my $yaccmode = 0; +my $in_rule = 0; my $brace_indent = 0; my (@arr, %found); my $comment = 0; @@ -131,10 +132,14 @@ while (<$parser_fh>) $found{$block} = 1; $cc++; $block = ''; + $in_rule = 0 if $arr[$fieldIndexer] eq ';'; } elsif (($arr[$fieldIndexer] =~ '[A-Za-z0-9]+:') || $arr[ $fieldIndexer + 1 ] eq ':') { + die "unterminated rule at grammar line $.\n" + if $in_rule; + $in_rule = 1; $non_term_id = $arr[$fieldIndexer]; $non_term_id =~ tr/://d; } @@ -145,6 +150,9 @@ while (<$parser_fh>) } } +die "unterminated rule at end of grammar\n" + if $in_rule; + close $parser_fh; if ($verbose) { diff --git a/src/interfaces/ecpg/preproc/parse.pl b/src/interfaces/ecpg/preproc/parse.pl index 768df3a6b1c..7ed43e6a87f 100644 --- a/src/interfaces/ecpg/preproc/parse.pl +++ b/src/interfaces/ecpg/preproc/parse.pl @@ -22,6 +22,7 @@ $path = "." unless $path; my $copymode = 0; my $brace_indent = 0; my $yaccmode = 0; +my $in_rule = 0; my $header_included = 0; my $feature_not_supported = 0; my $tokenmode = 0; @@ -288,6 +289,7 @@ sub main @fields = (); $infield = 0; $line = ''; + $in_rule = 0; next; } @@ -365,6 +367,9 @@ sub main $line = ''; @fields = (); $infield = 1; + die "unterminated rule at grammar line $.\n" + if $in_rule; + $in_rule = 1; next; } elsif ($copymode) @@ -415,6 +420,9 @@ sub main } } } + die "unterminated rule at end of grammar\n" + if $in_rule; + return; }