예제 #1
0
bool GetLngHlfParam (
		char* s,
		char* last,
		char** qb,
		char** qe,
		char* ParamName
		)
{
	SkipEmpty(s, last);

	if ( s == last )
		return false;

	if ( *s++ != '.' )
		return false;

	if ( !strncmp(s, ParamName, strlen(ParamName)) )
	{
		s += strlen(ParamName);

		SkipEmpty(s, last);

		if ( (s != last) && (*s == '=') )
		{
			*qb = s+1;
			*qe = last;

			return true;
		}
	}

	return false;
}
예제 #2
0
ParseExp::Result ParseExp::ParseItemType(POETCode* input, int *p_lineno)
   {
      POETCode* res = 0, *tail=0;
      if ( get_head(input) == lp) {
           Result resOfRest = ParseExpImpl(NextToken(input),exp_bop->get_entry().get_code(),0, p_lineno);
           if (get_head(resOfRest.second) == rp) {
                 input = NextToken(resOfRest.second);
                 res = resOfRest.first;
           }
           else return Result(0,input);
      }
      else if (match_expItem(input)) {
          try {
           res = parse_AST(input, exp_item->get_entry().get_code(), &tail);
           assert(res != 0);
           input=SkipEmpty(tail, p_lineno);
          }
          catch (ParseError err) { 
                   if (backtrack) return Result(0,input); 
                   throw err;
             }
      }
      else return Result(0,input);
     if (funcall->get_entry().get_code() != 0 && get_head(input) == lp)
     {
        CodeVar* fvar = dynamic_cast<CodeVar*>(funcall->get_entry().get_code());
        if (fvar == 0) INCORRECT_CVAR(funcall->get_entry().get_code());
        Result resOfTail = ParseExpImpl(NextToken(input),exp_bop->get_entry().get_code(),0, p_lineno);
        std::vector<POETCode*> argVec; 
        while (resOfTail.first!=0 && (get_head(resOfTail.second) != rp)) {
              argVec.push_back(resOfTail.first);
              resOfTail=ParseExpImpl(NextToken(resOfTail.second),exp_bop->get_entry().get_code(),0, p_lineno);
        }
        argVec.push_back(resOfTail.first);
        POETCode* args = Vector2List(argVec);
        if (args == 0) args = EMPTY;
        return Result(CODE_REF(fvar,PAIR(res,args)),
                      NextToken(resOfTail.second));
     }
     else if (arrref->get_entry().get_code() != 0 && get_head(input) == lb )
     {
        CodeVar* fvar = dynamic_cast<CodeVar*>(arrref->get_entry().get_code());
        if (fvar == 0) INCORRECT_CVAR(arrref->get_entry().get_code());
        std::vector<POETCode*> argVec; 
        while (get_head(input) == lb) 
        {
          Result resOfTail = ParseExpImpl(NextToken(input),exp_bop->get_entry().get_code(),0, p_lineno);
          if (resOfTail.first==0 || get_head(resOfTail.second) != rb) 
              return Result(res,input);
          argVec.push_back(resOfTail.first);
          input = NextToken(resOfTail.second);
        }
        POETCode* args = Vector2List(argVec);
        if (args == 0) args = EMPTY;
        return Result(CODE_REF(fvar,PAIR(res,args)),input);
     }
     return Result(res, input);
  }
예제 #3
0
void TLineSplitter::operator() (const char *p, yvector<TPair<const char*, size_t> >& fields) const {
    if (!p || !*p)
        return;
    const char *q = p;
    while (1) {
        p = Sep.brk(p);
        if (q && (p - q || !SkipEmpty()))
            fields.push_back(MakePair(q, p - q));
        q = 0;
        if (!*p)
            break;
        if (SepStrLen == 1 || (SepStrLen > 1 && !strncmp(p + 1, SepStr + 1, SepStrLen - 1))) {
            p += SepStrLen;
            q = p;
        } else
            p++;
    }
}
예제 #4
0
 Result parse(POETCode* input, int *p_lineno = 0) 
  { 
   POETCode* bop = exp_bop->get_entry().get_code();
   return ParseExpImpl(SkipEmpty(input, p_lineno), bop, 0, p_lineno); 
  }
예제 #5
0
파일: task079.cpp 프로젝트: berlios/pe
    return;
  }

  for (char c : "0123456789") {
    if (!AdvanceIndexesByLetter(strings, c, indexes)) {
      continue;
    }
    current_sequence->push_back(c);
    ShortestCommonSuperstring(strings, indexes, minimum_length_string,
                              current_sequence);
    current_sequence->pop_back();
    RetractIndexesByLetter(strings, c, indexes);
  }
}

std::string ShortestCommonSuperstring(const std::vector<std::string>& strings) {
  std::string sequence;
  std::vector<int> indexes(strings.size());
  std::string minimum_length_string =
      std::accumulate(strings.begin(), strings.end(), std::string{});
  ShortestCommonSuperstring(strings, &indexes, &minimum_length_string,
                            &sequence);
  return minimum_length_string;
}

TASK(79) {
  std::vector<std::string> strings =
      Split(ReadFileIntoString("data/079_keylog.txt"), '\n', SkipEmpty());
  return ShortestCommonSuperstring(strings);
}