aboutsummaryrefslogtreecommitdiffhomepage
path: root/parse_productions.cpp
diff options
context:
space:
mode:
authorGravatar Sanne Wouda <sanne.wouda@gmail.com>2015-03-11 23:53:24 +0100
committerGravatar David Adam <zanchey@ucc.gu.uwa.edu.au>2015-04-13 13:23:59 +0800
commitfd731fb74f7e0af3151f5afd8bc8b789e0e47dd4 (patch)
tree9c42d4269b8ba8dc80e92031be9acd899187cb79 /parse_productions.cpp
parentd1a56139e1d99530d38443f3681f3e7372e9923e (diff)
Modify parser to accept 'begin' without ';'
Examples that work as expected (even completions don't get confused): $ begin true; end; $ begin if true; end; end $ begin if true; echo hi; end The last example correctly expects another 'end' to match 'begin'. Fixes #1248.
Diffstat (limited to 'parse_productions.cpp')
-rw-r--r--parse_productions.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/parse_productions.cpp b/parse_productions.cpp
index 1dd0ab7f..6ef03f50 100644
--- a/parse_productions.cpp
+++ b/parse_productions.cpp
@@ -298,7 +298,7 @@ RESOLVE(freestanding_argument_list)
PRODUCTIONS(block_statement) =
{
- {symbol_block_header, parse_token_type_end, symbol_job_list, symbol_end_command, symbol_arguments_or_redirections_list}
+ {symbol_block_header, symbol_job_list, symbol_end_command, symbol_arguments_or_redirections_list}
};
RESOLVE_ONLY(block_statement)
@@ -328,25 +328,35 @@ RESOLVE(block_header)
PRODUCTIONS(for_header) =
{
- {KEYWORD(parse_keyword_for), parse_token_type_string, KEYWORD(parse_keyword_in), symbol_argument_list}
+ {KEYWORD(parse_keyword_for), parse_token_type_string, KEYWORD
+ (parse_keyword_in), symbol_argument_list, parse_token_type_end}
};
RESOLVE_ONLY(for_header)
PRODUCTIONS(while_header) =
{
- {KEYWORD(parse_keyword_while), symbol_job}
+ {KEYWORD(parse_keyword_while), symbol_job, parse_token_type_end}
};
RESOLVE_ONLY(while_header)
PRODUCTIONS(begin_header) =
{
+ {KEYWORD(parse_keyword_begin), parse_token_type_end},
{KEYWORD(parse_keyword_begin)}
};
-RESOLVE_ONLY(begin_header)
+RESOLVE(begin_header)
+{
+ switch (token2.type) {
+ case parse_token_type_end:
+ return 0;
+ default:
+ return 1;
+ }
+}
PRODUCTIONS(function_header) =
{
- {KEYWORD(parse_keyword_function), symbol_argument, symbol_argument_list}
+ {KEYWORD(parse_keyword_function), symbol_argument, symbol_argument_list, parse_token_type_end}
};
RESOLVE_ONLY(function_header)