Esempio n. 1
0
ExpPtr parseCall (Lexer& lex, ExpPtr in)
{
	auto args = parseTuple(lex);
	ExpList exps;

	exps.reserve(args->subexps.size() + 1);
	exps.push_back(in);
	exps.insert(exps.end(), args->subexps.begin(), args->subexps.end());

	return Exp::make(eCall, exps, in->span + args->span);
}
Esempio n. 2
0
ParseStatus Parser::parseFunction() {
  assert(lex[0].type == TT_KEYWORD && lex[0].value == KW_FUNCTION);
  lex++;

  ParseStatus error = parseTuple();
  if (error) return error;

  assert(lex[0].type == TT_OPERATOR && lex[0].value == OP_RARROW);
  error = parseTuple();
  if (error) return error;

  error = parseBlock();
  if (error) return error;

  // Args, result, and block are on the stack.
  // Create a new function to hold them and push it on the stack.
  assert(false);
  
  return PARSE_OK;
}
Esempio n. 3
0
ExpPtr parseTermPrefix (Lexer& lex)
{
	Token tok = lex.current();

	switch (tok.tok)
	{
	case tNumberInt:
		tok = lex.advance();
		return Exp::make(eInt, tok.valueInt, {}, tok.span);

	case tNumberReal:
		tok = lex.advance();
		return Exp::make(eReal, tok.valueReal, {}, tok.span);

	case tString:
		tok = lex.advance();
		return Exp::make(eString, tok.str, {}, tok.span);

	case tTrue:
	case tFalse:
		tok = lex.advance();
		return Exp::make(eBool, tok == tTrue, {}, tok.span);

	case tIdent:
		tok = lex.advance();
		return Exp::make(eVar, tok.str, bool(true), {}, tok.span);

	case tLParen:
		return parseTuple(lex);
	case tIf:
		return parseCond(lex);
	case tLCurl:
		return parseBlock(lex);
	case tLBrack:
		return parseList(lex);

	case tFunc: case tLambda:
		return parseLambda(lex);

	case tiMake:  return parseiMake(lex);
	case tiGet:   return parseiGet(lex);
	case tiPut:   return parseiPut(lex);
	case tiCall:  return parseiCall(lex);

	default:
		//lex.expect("term");
		lex.unexpect();
		return nullptr;
	}
}
Esempio n. 4
0
void DemandListModel::parseCsvString(QString const& csvText, QString const& sep){

	QStringList lines = csvText.split("\n");

	for(QString line : lines){

		bool ok;
		DemandTuple tup = parseTuple(line, sep, ok);

		if(ok){
			insertDemandTuple(tup);
		}

	}
}
Esempio n. 5
0
void GdbMi::parseValue(const char *&from, const char *to)
{
    //qDebug() << "parseValue: " << QByteArray(from, to - from);
    switch (*from) {
        case '{':
            parseTuple(from, to);
            break;
        case '[':
            parseList(from, to);
            break;
        case '"':
            m_type = Const;
            m_data = parseCString(from, to);
            break;
        default:
            break;
    }
}
Esempio n. 6
0
void DemandListModel::parseJsonObject(QJsonObject const& rep){

	if(rep.contains(nextInsertIdIndex)){
		_nextInsertId = rep.value(nextInsertIdIndex).toInt();
	}

	if(rep.contains(numberOfChoicesIndex)){
		setNumberOfChoices(rep.value(numberOfChoicesIndex).toInt());
	}

	if(rep.contains(additionalVarsIndex)){
		if(rep.value(additionalVarsIndex).isArray()){
			QVector<QString> additionals;
			for(QJsonValue val: rep.value(additionalVarsIndex).toArray()){
				if(val.isString()) {
					additionals.push_back(val.toString());
				}
			}
			_additionalVariablesName = additionals;
		}
	}

	if(rep.contains(tuplesIndex)){
		if(rep.value(tuplesIndex).isArray()){

			emptyTuples();

			for(QJsonValue val: rep.value(tuplesIndex).toArray()){
				if(val.isObject()){
					bool ok;
					DemandTuple tuple = parseTuple(val.toObject(), ok);

					if(ok){
						insertDemandTuple(tuple);
					}
				}
			}
		}
	}

	emit(changedDatas());
}
Esempio n. 7
0
  virtual void visitOperator(POETOperator *op)
  {
     switch (op->get_op()) {
     case POET_OP_TUPLE: {
       parseTuple(op->get_arg(0));
       break;
      }
     case TYPE_LIST1:
     case TYPE_LIST: {
         POETCode* arg = op->get_arg(0);
         POETCode* matchSave = fullmatch; fullmatch = EMPTY;
         std::vector<POETCode*> match_res;
         do {
            POETCode* r1_first=match_eval(arg);
            if (r1_first == 0)  { 
                fullmatch = matchSave;
                if (fullmatch != 0) {
                    res = Vector2List(match_res); 
                    if (res == EMPTY && op->get_op() == TYPE_LIST1)
                         PARSE_MISMATCH(r1,op,lineno);
                    return; 
                   }
                else PARSE_MISMATCH(r1,op,lineno);
            }
            match_res.push_back(r1_first);
         } while (r1 != 0);
         fullmatch = matchSave;
         if (match_res.size() == 0) PARSE_MISMATCH(r1,op,lineno);
         res = Vector2List(match_res);
         assert(res != EMPTY);
         return;
       }
     case TYPE_TOR: {
        POETCode* r1_first = get_head(r1);
        if (r1_first->get_enum() == SRC_CVAR &&
             static_cast<CodeVar*>(r1_first)->get_parseInfo() != EMPTY) 
            { /*QY: r1_first is already parsed and is not a token*/  
              if (!match_eval(op)) PARSE_MISMATCH(r1,op,lineno);
              return;
            }
 
         if (!backtrack) {
            POETTypeTor* tor = static_cast<POETTypeTor*>(op);
            POETCode* arg = tor->get_parseInfo(this, r1);
            apply(arg, fullmatch); 
            if (fullmatch != 0) fullmatch=EMPTY; 
            return;
         }
         else  {
            POETCode* r1save = r1;
            size_t size = op->numOfArgs();
            for (unsigned i = 0; i < size; ++i) {
               POETCode* arg = op->get_arg(i);
               POETCode* filter = 0;
               switch (arg->get_enum()) {
               case SRC_STRING: if (arg != EMPTY) filter = arg; break;
               case SRC_CVAR:
                 filter=static_cast<CodeVar*>(arg)->get_parseInfo();
                 if (filter != 0 && filter->get_enum() == SRC_LIST)
                    filter = static_cast<POETList*>(filter)->get_first();
                 else filter = 0;
                 break;
               default: ; /* no filtering */
               }
               if (filter != 0 && filter->get_enum()==SRC_STRING && filter != r1_first) {
                 continue;
               }
               try { apply(arg, EMPTY);
                    if (res != 0) return; }
               catch (ParseError err) { r1 = r1save; }
            }
         }
         PARSE_MISMATCH(r1,op,lineno);
         return;
      }
     case POET_OP_EXP: {
       ParseExp::Result exp_res = ParseExp::inst()->parse(r1, &lineno);
       res = exp_res.first;
       if (res == 0) PARSE_MISMATCH(r1,op,lineno); 
       if (fullmatch != 0) r1 = exp_res.second;
       else if (exp_res.second != 0 && exp_res.second != EMPTY) 
             { PARSE_MISMATCH_LEFT(exp_res.second,lineno); }
       else r1 = 0;
       break;
       }
     case POET_OP_LIST1:
     case POET_OP_LIST: {
       POETParseList* oplist = dynamic_cast<POETParseList*>(op);
       assert(oplist != 0);
       std::string sepString;
       POETCode* sep = op->get_arg(1);
       if (sep != 0) { 
           sep  = eval_AST(sep);  
           POETString* sep1 = AST2String(sep);
           if (sep1 == 0) INCORRECT_STRING(sep);
           sepString = sep1->get_content();
       }
       else sep = EMPTY;
       if (IS_SPACE(sepString)) sep = EMPTY;
       try { parseList(oplist, op->get_arg(0), sep); }
       catch (ParseError err) { 
           if (op->get_op() == POET_OP_LIST && backtrack && fullmatch != 0) res = EMPTY; 
           else throw err; }
       break;
     }
     default:
        defaultVisit(eval_AST(op));
     }
  }