summaryrefslogtreecommitdiffstats
path: root/parse.cxx
diff options
context:
space:
mode:
authorTim Moore <timoore@redhat.com>2009-12-23 09:14:02 +0100
committerTim Moore <timoore@redhat.com>2009-12-23 09:14:02 +0100
commit69ce6c79dbcb2cec2d1245935ef20bf832ffe70a (patch)
tree0b6aea71ef4f3ca5c797494d062819bfba63e7f7 /parse.cxx
parent72195f6b17c0ed2e508c58bf3cadd5b9dc4e28ac (diff)
parent0ee3adb42f2f6d8bffe177e77a415b3a74f3a777 (diff)
downloadsystemtap-steved-69ce6c79dbcb2cec2d1245935ef20bf832ffe70a.tar.gz
systemtap-steved-69ce6c79dbcb2cec2d1245935ef20bf832ffe70a.tar.xz
systemtap-steved-69ce6c79dbcb2cec2d1245935ef20bf832ffe70a.zip
Merge remote branch 'origin/master'
Diffstat (limited to 'parse.cxx')
-rw-r--r--parse.cxx35
1 files changed, 22 insertions, 13 deletions
diff --git a/parse.cxx b/parse.cxx
index 74d7c634..55ec53fb 100644
--- a/parse.cxx
+++ b/parse.cxx
@@ -1207,6 +1207,7 @@ parser::parse_stmt_block ()
statement*
parser::parse_statement ()
{
+ statement *ret;
const token* t = peek ();
if (t && t->type == tok_operator && t->content == ";")
{
@@ -1215,34 +1216,42 @@ parser::parse_statement ()
return n;
}
else if (t && t->type == tok_operator && t->content == "{")
- return parse_stmt_block ();
+ return parse_stmt_block (); // Don't squash semicolons.
else if (t && t->type == tok_keyword && t->content == "if")
- return parse_if_statement ();
+ return parse_if_statement (); // Don't squash semicolons.
else if (t && t->type == tok_keyword && t->content == "for")
- return parse_for_loop ();
+ return parse_for_loop (); // Don't squash semicolons.
else if (t && t->type == tok_keyword && t->content == "foreach")
- return parse_foreach_loop ();
+ return parse_foreach_loop (); // Don't squash semicolons.
+ else if (t && t->type == tok_keyword && t->content == "while")
+ return parse_while_loop (); // Don't squash semicolons.
else if (t && t->type == tok_keyword && t->content == "return")
- return parse_return_statement ();
+ ret = parse_return_statement ();
else if (t && t->type == tok_keyword && t->content == "delete")
- return parse_delete_statement ();
- else if (t && t->type == tok_keyword && t->content == "while")
- return parse_while_loop ();
+ ret = parse_delete_statement ();
else if (t && t->type == tok_keyword && t->content == "break")
- return parse_break_statement ();
+ ret = parse_break_statement ();
else if (t && t->type == tok_keyword && t->content == "continue")
- return parse_continue_statement ();
+ ret = parse_continue_statement ();
else if (t && t->type == tok_keyword && t->content == "next")
- return parse_next_statement ();
- // XXX: "do/while" statement?
+ ret = parse_next_statement ();
else if (t && (t->type == tok_operator || // expressions are flexible
t->type == tok_identifier ||
t->type == tok_number ||
t->type == tok_string))
- return parse_expr_statement ();
+ ret = parse_expr_statement ();
// XXX: consider generally accepting tok_embedded here too
else
throw parse_error ("expected statement");
+
+ // Squash "empty" trailing colons after any "non-block-like" statement.
+ t = peek ();
+ if (t && t->type == tok_operator && t->content == ";")
+ {
+ next (); // Silently eat trailing ; after statement
+ }
+
+ return ret;
}