summaryrefslogtreecommitdiffstats
path: root/staptree.cxx
diff options
context:
space:
mode:
authorfche <fche>2005-06-02 19:43:55 +0000
committerfche <fche>2005-06-02 19:43:55 +0000
commit69c68955b910a9f284fa25b9ebb30eff5c040e0b (patch)
tree3fa502458891d0b54150d678368f7a2dee18fa0f /staptree.cxx
parentf37b5c92191dd81aad57ade2899a4999099a3e35 (diff)
downloadsystemtap-steved-69c68955b910a9f284fa25b9ebb30eff5c040e0b.tar.gz
systemtap-steved-69c68955b910a9f284fa25b9ebb30eff5c040e0b.tar.xz
systemtap-steved-69c68955b910a9f284fa25b9ebb30eff5c040e0b.zip
2005-06-02 Frank Ch. Eigler <fche@redhat.com>
Parse foreach construct. Added fuller copyright notices throughout. * staptree.h (foreach_loop): New tree node type. * staptree.cxx: Print it, visit it, love it, leave it. * parse.cxx: Parse it. (parse_stmt_block): Don't require ";" separators between statements. (parse_array_in): Use [] as index group operator instead of (). * elaborate.cxx (visit_foreach_loop): New code. * translate.cxx: Slightly tighten errorcount/actioncount handling. * main.cxx: Accept "-" as script file name standing for stdin. (visit_arrayindex): Switch to simpler set_arity call. * configure.ac: Generate DATE macro. * Makefile.in, configure, config.in: Regenerated. * testsuite/*: New/updated tests for syntax changes, foreach ().
Diffstat (limited to 'staptree.cxx')
-rw-r--r--staptree.cxx53
1 files changed, 50 insertions, 3 deletions
diff --git a/staptree.cxx b/staptree.cxx
index cf934fa2..d0fd79be 100644
--- a/staptree.cxx
+++ b/staptree.cxx
@@ -1,6 +1,10 @@
// parse tree functions
-// Copyright 2005 Red Hat Inc.
-// GPL
+// Copyright (C) 2005 Red Hat Inc.
+//
+// This file is part of systemtap, and is free software. You can
+// redistribute it and/or modify it under the terms of the GNU General
+// Public License (GPL); either version 2, or (at your option) any
+// later version.
#include "config.h"
#include "staptree.h"
@@ -169,6 +173,16 @@ void unary_expression::print (ostream& o)
o << op << '(' << *operand << ")";
}
+void array_in::print (ostream& o)
+{
+ o << "[";
+ for (unsigned i=0; i<operand->indexes.size(); i++)
+ {
+ if (i > 0) o << ", ";
+ operand->indexes[i]->print (o);
+ }
+ o << "] in " << operand->base;
+}
void post_crement::print (ostream& o)
{
@@ -262,7 +276,7 @@ void block::print (ostream& o)
{
o << "{" << endl;
for (unsigned i=0; i<statements.size(); i++)
- o << *statements [i] << ";" << endl;
+ o << *statements [i] << endl;
o << "}" << endl;
}
@@ -273,6 +287,19 @@ void for_loop::print (ostream& o)
}
+void foreach_loop::print (ostream& o)
+{
+ o << "foreach ([";
+ for (unsigned i=0; i<indexes.size(); i++)
+ {
+ if (i > 0) o << ", ";
+ indexes[i]->print (o);
+ }
+ o << "] in " << base << ")" << endl;
+ block->print (o);
+}
+
+
void null_statement::print (ostream& o)
{
o << ";";
@@ -395,6 +422,12 @@ for_loop::visit (visitor* u)
}
void
+foreach_loop::visit (visitor* u)
+{
+ u->visit_foreach_loop (this);
+}
+
+void
null_statement::visit (visitor* u)
{
u->visit_null_statement (this);
@@ -566,6 +599,14 @@ traversing_visitor::visit_for_loop (for_loop* s)
}
void
+traversing_visitor::visit_foreach_loop (foreach_loop* s)
+{
+ for (unsigned i=0; i<s->indexes.size(); i++)
+ s->indexes[i]->visit (this);
+ s->block->visit (this);
+}
+
+void
traversing_visitor::visit_return_statement (return_statement* s)
{
s->value->visit (this);
@@ -733,6 +774,12 @@ throwing_visitor::visit_for_loop (for_loop* s)
}
void
+throwing_visitor::visit_foreach_loop (foreach_loop* s)
+{
+ throwone (s->tok);
+}
+
+void
throwing_visitor::visit_return_statement (return_statement* s)
{
throwone (s->tok);