From 934845563af3c85df78c17ee4752caa100ea6157 Mon Sep 17 00:00:00 2001 From: fche Date: Fri, 7 Oct 2005 19:09:02 +0000 Subject: 2005-10-07 Frank Ch. Eigler PR 1366. * staptree.h (foreach_loop): Add sort_column, sort_direction fields. * parse.cxx (parse_foreach_loop): Parse "+"/"-" suffix operators. * stap.1.in, stapex.5.in: Document them. * staptree.cxx (foreach_loop print, copy): Propagate them. * translate.cxx (visit_foreach_loop): Support them. * testsuite/parseok/fifteen.stp, parseko/thirteen.stp, buildok/twentyone.stp: Test them. 2005-10-07 Frank Ch. Eigler PR 1366. * systemtap.samples/primes.*: Sort foreach gratuitiously. --- parse.cxx | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'parse.cxx') diff --git a/parse.cxx b/parse.cxx index 9f714359..bbb209b8 100644 --- a/parse.cxx +++ b/parse.cxx @@ -1148,6 +1148,7 @@ parser::parse_foreach_loop () throw parse_error ("expected 'foreach'"); foreach_loop* s = new foreach_loop; s->tok = t; + s->sort_direction = 0; t = next (); if (! (t->type == tok_operator && t->content == "(")) @@ -1173,9 +1174,20 @@ parser::parse_foreach_loop () sym->name = t->content; s->indexes.push_back (sym); + t = peek (); + if (t && t->type == tok_operator && + (t->content == "+" || t->content == "-")) + { + if (s->sort_direction) + throw parse_error ("multiple sort directives"); + s->sort_direction = (t->content == "+") ? 1 : -1; + s->sort_column = s->indexes.size(); + next(); + } + if (parenthesized) { - const token* t = peek (); + t = peek (); if (t && t->type == tok_operator && t->content == ",") { next (); @@ -1202,6 +1214,17 @@ parser::parse_foreach_loop () throw parse_error ("expected identifier"); s->base = t->content; + t = peek (); + if (t && t->type == tok_operator && + (t->content == "+" || t->content == "-")) + { + if (s->sort_direction) + throw parse_error ("multiple sort directives"); + s->sort_direction = (t->content == "+") ? 1 : -1; + s->sort_column = 0; + next(); + } + t = next (); if (! (t->type == tok_operator && t->content == ")")) throw parse_error ("expected ')'"); -- cgit