Changeset 536 for trunk/lib/Parser.cc


Ignore:
Timestamp:
Dec 27, 2007, 4:32:43 AM (14 years ago)
Author:
Peter Johansson
Message:

refs #289 - Parser now is fed with lines and does not read file during construction.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/Parser.cc

    r528 r536  
    4040
    4141  Parser::Parser(std::string path)
     42    : mode_(0)
    4243  {
    43     std::ifstream is(path.c_str());
    44     assert(is.good());
    45     const std::vector<std::pair<std::string, std::string> >* codon =
    46       Configuration::instance().codon(path);
    47     if (codon)
    48       parse(is, *codon);
    49     else
    50       text_mode(is);
    51     is.close();
     44    codon_ = Configuration::instance().codon(path);
    5245  }
    5346
    5447
    55   void Parser::parse(std::istream& is,
    56                      const std::vector<std::pair<std::string, std::string> >&
    57                      codon)
     48  Parser::line_type Parser::parse(const std::string& line)
     49  {
     50    if (codon_)
     51      type_.push_back(code_mode(line));
     52    else
     53      type_.push_back(text_mode(line));
     54    return type_.back();
     55                     
     56  }
     57
     58
     59  Parser::line_type Parser::code_mode(const std::string& str)
    5860  {
    5961    // mode zero means we are currently not in a comment
    6062    // if mode!=0 comment is closed by codon[mode-1].second -> mode=0
    6163    // if codon[x-1].start is found and x >= mode -> mode=x
    62     size_t mode = 0;
    63     std::string str;
    64     while(getline(is,str)) {
    65       line_type lt=other;
    66       for (std::string::iterator iter=str.begin(); iter!=str.end(); ++iter){
    67         for (size_t i=mode; i<codon.size(); ++i) {
    68           if ( iter==str.begin() && codon[i].first[0] == '\n' &&
    69                match_begin(iter, str.end(), codon[i].first.substr(1)) ) {
    70             iter += codon[i].first.size()-1;
    71             mode = i+1;
     64    line_type lt=other;
     65    {
     66      for (std::string::const_iterator iter=str.begin();iter!=str.end();++iter){
     67        for (size_t i=mode_; i<codon_->size(); ++i) {
     68          if ( iter==str.begin() && (*codon_)[i].first[0] == '\n' &&
     69               match_begin(iter, str.end(), (*codon_)[i].first.substr(1)) ) {
     70            iter += (*codon_)[i].first.size()-1;
     71            mode_ = i+1;
    7272            break;
    7373          }
    74           if (match_begin(iter, str.end(), codon[i].first)) {
    75             iter += codon[i].first.size();
    76             mode = i+1;
     74          if (match_begin(iter, str.end(), (*codon_)[i].first)) {
     75            iter += (*codon_)[i].first.size();
     76            mode_ = i+1;
    7777            break;
    7878          }
     
    8080        if (iter==str.end())
    8181          break;
    82         assert(mode==0 || mode-1<codon.size());
    83         if (mode && match_begin(iter,str.end(), codon[mode-1].second)){
    84           iter += codon[mode-1].second.size();
    85           mode=0;
     82        assert(mode_==0 || mode_-1<(*codon_).size());
     83        if (mode_ && match_begin(iter,str.end(), (*codon_)[mode_-1].second)){
     84          iter += (*codon_)[mode_-1].second.size();
     85          mode_=0;
    8686          if (iter==str.end())
    8787            break;
    8888        }
    89         else if (!mode && isgraph(*iter))
     89        else if (!mode_ && isgraph(*iter))
    9090          lt=code;
    91         else if (mode && lt!=code && isalnum(*iter))
     91        else if (mode_ && lt!=code && isalnum(*iter))
    9292          lt=comment;
    9393      }
    94       if (mode && codon[mode-1].second==std::string("\n"))
    95         mode=0;
    96       type_.push_back(lt);
     94      if (mode_ && (*codon_)[mode_-1].second==std::string("\n"))
     95        mode_=0;
    9796    }
     97    return lt;
    9898  }
    9999
    100100
    101   void Parser::text_mode(std::istream& is)
     101  Parser::line_type Parser::text_mode(const std::string& str)
    102102  {
    103     std::string str;
    104     while(getline(is,str)) {
    105       line_type lt=other;
    106       for (std::string::iterator iter=str.begin(); iter!=str.end(); ++iter){
    107         if (lt==other && isalnum(*iter))
    108           lt = comment;
    109       }
    110       type_.push_back(lt);
    111     }
     103    for (std::string::const_iterator iter=str.begin(); iter!=str.end(); ++iter)
     104      if (isalnum(*iter))
     105        return comment;
     106    return other;
    112107  }
    113108
Note: See TracChangeset for help on using the changeset viewer.