From: Frank Ch. Eigler Date: Thu, 11 Sep 2008 03:11:30 +0000 (-0400) Subject: parser/scanner speedup X-Git-Tag: release-0.7.2~13^2~10 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=eacb10cec9899c79ae1e122a7b6e50106928a295;p=systemtap.git parser/scanner speedup --- diff --git a/ChangeLog b/ChangeLog index 1c5755359..ae88d6536 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-09-10 Frank Ch. Eigler + + * parse.cxx, parse.h: Rewrite scanner lookahead data structure + to a simple ~fixed vector. + 2008-09-10 Frank Ch. Eigler PR6876: translator speedup for many $vars diff --git a/parse.cxx b/parse.cxx index 00991022c..1c1772f62 100644 --- a/parse.cxx +++ b/parse.cxx @@ -15,6 +15,7 @@ #include "util.h" #include + #include #include #include @@ -24,6 +25,8 @@ #include #include #include +#include + extern "C" { #include } @@ -576,20 +579,23 @@ parser::peek_kw (std::string const & kw) lexer::lexer (istream& i, const string& in, systemtap_session& s): - input (i), input_name (in), cursor_suspend_count(0), + input (i), input_name (in), + input_pointer (0), cursor_suspend_count(0), cursor_line (1), cursor_column (1), session(s) -{ } +{ + char c; + while(input.get(c)) + input_contents.push_back(c); +} int lexer::input_peek (unsigned n) { - while (lookahead.size() <= n) - { - int c = input.get (); - lookahead.push_back (input ? c : -1); - } - return lookahead[n]; + if (input_contents.size() > (input_pointer + n)) + return (int)(unsigned char)input_contents[input_pointer+n]; + else + return -1; } @@ -597,7 +603,7 @@ int lexer::input_get () { int c = input_peek (0); - lookahead.erase (lookahead.begin ()); + input_pointer ++; if (c < 0) return c; // EOF @@ -617,6 +623,7 @@ lexer::input_get () cursor_column ++; } + // clog << "[" << (char)c << "]"; return c; } @@ -624,13 +631,9 @@ lexer::input_get () void lexer::input_put (const string& chars) { - // clog << "[put:" << chars << "]"; - for (int i=chars.size()-1; i>=0; i--) - { - int c = chars[i]; - lookahead.insert (lookahead.begin(), c); - cursor_suspend_count ++; - } + // clog << "[put:" << chars << " @" << input_pointer << "]"; + input_contents.insert (input_contents.begin() + input_pointer, chars.begin(), chars.end()); + cursor_suspend_count += chars.size(); } diff --git a/parse.h b/parse.h index 25c429315..50b1507d2 100644 --- a/parse.h +++ b/parse.h @@ -79,7 +79,8 @@ private: int input_peek (unsigned n=0); std::istream& input; std::string input_name; - std::vector lookahead; + std::vector input_contents; + int input_pointer; // index into input_contents unsigned cursor_suspend_count; unsigned cursor_line; unsigned cursor_column;