#include #include "Piraha.hpp" using namespace cctki_piraha; Matcher::Matcher(smart_ptr g_,const char *pat_,const char *input_,int input_size_) : Group(pat_,input_), input(input_), g(g_), input_size(input_size_), pos(0), max_pos(-1), pat(pat_), expected(), err_pos(-1) { inrule = pat_; if(input_size < 0) input_size=strlen(input); } bool Matcher::matches() { smart_ptr p = g->patterns.get(pat); if(!p.valid()) { std::cout << "Grammar does not contain \"" << pat << "\"" << std::endl; std::cout << g->patterns << std::endl; } assert(p.valid()); pos = 0; max_pos = -1; err_pos = -1; children.clear(); bool b = p->match(this); end_ = pos; return b; } void Matcher::fail(Bracket *br) { for(unsigned int i=0;iranges.size();i++) { fail(br->ranges[i]->lo,br->ranges[i]->hi); } } void Matcher::fail(char lo,char hi) { if(pos == max_pos+1) { if(err_pos < pos) expected.ranges.clear(); expected.addRange(lo,hi); inrule_max = inrule; err_pos = pos; } } void Matcher::showError() { int line = 1; int error_pos = -1; const int num_previous_lines = 4; int start_of_line = 0; int start_of_previous_line[num_previous_lines]; for(int i=0;i