コード例 #1
0
ファイル: FlowParser.cpp プロジェクト: hiwang123/x0
// castExpr ::= 'int' '(' expr ')'
//            | 'string' '(' expr ')'
//            | 'bool' '(' expr ')'
std::unique_ptr<Expr> FlowParser::castExpr()
{
	FNTRACE();
	FlowLocation sloc(location());

	FlowToken targetTypeToken = token();
	nextToken();

	if (!consume(FlowToken::RndOpen))
		return nullptr;

	std::unique_ptr<Expr> e(expr());

	if (!consume(FlowToken::RndClose))
		return nullptr;

	if (!e)
		return nullptr;

    Opcode targetType = makeOperator(targetTypeToken, e.get());
    if (targetType == Opcode::EXIT) {
        reportError("Type cast error. No cast implementation found for requested cast from %s to %s.",
                tos(e->getType()).c_str(), targetTypeToken.c_str());
        return nullptr;
    }

    if (targetType == Opcode::NOP) {
        return e;
    }

    printf("Type cast from %s to %s: %s\n", tos(e->getType()).c_str(), targetTypeToken.c_str(), mnemonic(targetType));
	return std::make_unique<UnaryExpr>(targetType, std::move(e), sloc.update(end()));
}
コード例 #2
0
ファイル: FlowParser.cpp プロジェクト: hiwang123/x0
std::unique_ptr<Expr> FlowParser::powExpr()
{
	// powExpr ::= primaryExpr ('**' powExpr)*
	FNTRACE();

	FlowLocation sloc(location());
	std::unique_ptr<Expr> left = primaryExpr();
	if (!left)
		return nullptr;

	while (token() == FlowToken::Pow) {
		nextToken();

		std::unique_ptr<Expr> right = powExpr();
		if (!right)
			return nullptr;

        auto opc = makeOperator(FlowToken::Pow, left.get(), right.get());
        if (opc == Opcode::EXIT) {
            reportError("Type error in binary expression (%s versus %s).",
                        tos(left->getType()).c_str(), tos(right->getType()).c_str());
            return nullptr;
        }

		left = std::make_unique<BinaryExpr>(opc, std::move(left), std::move(right));
	}

	return left;
}
コード例 #3
0
ファイル: FlowParser.cpp プロジェクト: hiwang123/x0
// compoundStmt ::= '{' varDecl* stmt* '}'
std::unique_ptr<Stmt> FlowParser::compoundStmt()
{
	FNTRACE();
	FlowLocation sloc(location());
	nextToken(); // '{'

	std::unique_ptr<CompoundStmt> cs = std::make_unique<CompoundStmt>(sloc);

	while (token() == FlowToken::Var) {
		if (std::unique_ptr<Variable> var = varDecl())
			scope()->appendSymbol(std::move(var));
		else
			return nullptr;
	}

	for (;;) {
		if (consumeIf(FlowToken::End)) {
			cs->location().update(end());
			return std::unique_ptr<Stmt>(cs.release());
		}

		if (std::unique_ptr<Stmt> s = stmt())
			cs->push_back(std::move(s));
		else
			return nullptr;
	}
}
コード例 #4
0
ファイル: FlowParser.cpp プロジェクト: hiwang123/x0
std::unique_ptr<Stmt> FlowParser::ifStmt()
{
	// ifStmt ::= 'if' expr ['then'] stmt ['else' stmt]
	FNTRACE();
	FlowLocation sloc(location());

	consume(FlowToken::If);
	std::unique_ptr<Expr> cond(expr());
	consumeIf(FlowToken::Then);

	std::unique_ptr<Stmt> thenStmt(stmt());
	if (!thenStmt)
		return nullptr;

	std::unique_ptr<Stmt> elseStmt;

	if (consumeIf(FlowToken::Else)) {
		elseStmt = std::move(stmt());
		if (!elseStmt) {
			return nullptr;
		}
	}

	return std::make_unique<CondStmt>(std::move(cond),
		std::move(thenStmt), std::move(elseStmt), sloc.update(end()));
}
コード例 #5
0
ファイル: FlowParser.cpp プロジェクト: hiwang123/x0
std::unique_ptr<Expr> FlowParser::interpolatedStr()
{
	FNTRACE();

	FlowLocation sloc(location());
	std::unique_ptr<Expr> result = std::make_unique<StringExpr>(stringValue(), sloc.update(end()));
	nextToken(); // interpolation start

	std::unique_ptr<Expr> e(expr());
	if (!e)
		return nullptr;

    result = asString(std::move(result));
    if (!result) {
        reportError("Cast error in string interpolation.");
        return nullptr;
    }

	while (token() == FlowToken::InterpolatedStringFragment) {
		FlowLocation tloc = sloc.update(end());
		result = std::make_unique<BinaryExpr>(
            Opcode::SADD,
			std::move(result),
			std::make_unique<StringExpr>(stringValue(), tloc)
		);
		nextToken();

		e = expr();
		if (!e)
			return nullptr;

        e = asString(std::move(e));
        if (!e) {
            reportError("Cast error in string interpolation.");
            return nullptr;
        }

		result = std::make_unique<BinaryExpr>(Opcode::SADD, std::move(result), std::move(e));
	}

	if (!consume(FlowToken::InterpolatedStringEnd))
		return nullptr;

	if (!stringValue().empty()) {
		result = std::make_unique<BinaryExpr>(
            Opcode::SADD,
			std::move(result),
			std::make_unique<StringExpr>(stringValue(), sloc.update(end()))
		);
	}
	nextToken();
	return result;
}
コード例 #6
0
ファイル: FlowParser.cpp プロジェクト: hiwang123/x0
// }}}
// {{{ stmt
std::unique_ptr<Stmt> FlowParser::stmt()
{
	FNTRACE();

	switch (token()) {
		case FlowToken::If:
			return ifStmt();
		case FlowToken::Begin:
			return compoundStmt();
		case FlowToken::Ident:
			return callStmt();
		case FlowToken::Semicolon: {
			FlowLocation sloc(location());
			nextToken();
			return std::make_unique<CompoundStmt>(sloc.update(end()));
		}
		default:
			reportError("Unexpected token '%s'. Expected a statement instead.", token().c_str());
			return nullptr;
	}
}
コード例 #7
0
ファイル: main.cpp プロジェクト: DaveAckley/MFM
    void ReinitEden()
    {
      OurGrid & mainGrid = GetGrid();
      OurStatsRenderer & srend = GetStatsRenderer();

      OurAtom atom(Element_Dreg<OurCoreConfig>::THE_INSTANCE.GetDefaultAtom());
      OurAtom sorter(Element_Sorter<OurCoreConfig>::THE_INSTANCE.GetDefaultAtom());
      OurAtom emtr(Element_Emitter<OurCoreConfig>::THE_INSTANCE.GetDefaultAtom());
      OurAtom cnsr(Element_Consumer<OurCoreConfig>::THE_INSTANCE.GetDefaultAtom());

      m_sortingSlots[0].Set(mainGrid, "Data in",
                            Element_Emitter<OurCoreConfig>::THE_INSTANCE.GetType(),
                            Element_Emitter<OurCoreConfig>::DATUMS_EMITTED_SLOT,
                            Element_Emitter<OurCoreConfig>::DATA_SLOT_COUNT,
                            true);
      m_sortingSlots[1].Set(mainGrid, "Overflow",
                            Element_Emitter<OurCoreConfig>::THE_INSTANCE.GetType(),
                            Element_Emitter<OurCoreConfig>::DATUMS_REJECTED_SLOT,
                            Element_Emitter<OurCoreConfig>::DATA_SLOT_COUNT,
                            true);

      m_sortingSlots[2].Set(mainGrid, "Data out",
                            Element_Consumer<OurCoreConfig>::THE_INSTANCE.GetType(),
                            Element_Consumer<OurCoreConfig>::DATUMS_CONSUMED_SLOT,
                            Element_Consumer<OurCoreConfig>::DATA_SLOT_COUNT,
                            true);
      m_sortingSlots[3].Set(mainGrid, "Sort error",
                            Element_Consumer<OurCoreConfig>::THE_INSTANCE.GetType(),
                            Element_Consumer<OurCoreConfig>::TOTAL_BUCKET_ERROR_SLOT,
                            Element_Consumer<OurCoreConfig>::DATA_SLOT_COUNT,
                            true);

      for (u32 i = 0; i < 4; ++i)
        srend.DisplayDataReporter(&m_sortingSlots[i]);

      //      sorter.SetStateField(0,32,DATA_MINVAL + ((DATA_MAXVAL - DATA_MINVAL) / 2));  // Default threshold
      sorter.SetStateField(0,32, DATA_MINVAL);  // Default threshold

      u32 realWidth = P::TILE_WIDTH - P::EVENT_WINDOW_RADIUS * 2;

      SPoint aloc(20, 30);
      SPoint sloc(20, 10);
      SPoint eloc(GRID_WIDTH*realWidth-2, GRID_HEIGHT*realWidth/2);
      SPoint cloc(0, GRID_HEIGHT*realWidth/2);

      for(u32 x = 0; x < mainGrid.GetWidth(); x++)
        {
          for(u32 y = 0; y < mainGrid.GetHeight(); y++)
            {
              for(u32 z = 0; z < 4; z++)
                {
                  aloc.Set(10 + x * realWidth + z, 14 + y * realWidth);
                  sloc.Set(11 + x * realWidth + z, 15 + y * realWidth);
                  mainGrid.PlaceAtom(sorter, sloc);
                  mainGrid.PlaceAtom(atom, aloc);
                }
            }
        }
      mainGrid.PlaceAtom(emtr, eloc);
      mainGrid.PlaceAtom(cnsr, cloc);

    }
コード例 #8
0
ファイル: symboltable.cpp プロジェクト: Wassasin/splicpp
	void symboltable::check_types() const
	{
		s_ptr<typecontext> global(new typecontext());
		ltypecontext c(global);
		substitution s;
		
		std::map<sid, s_ptr<const sl_polytype_exists>> init_types;
		for(size_t i = 0; i < index.size(); i++)
			if(index[i].t == symbolref::t_var || index[i].t == symbolref::t_fun)
			{
				const s_ptr<const sl_polytype_exists> t(new sl_polytype_exists());
				init_types[i] = t;
				c.register_type(i, std::static_pointer_cast<const sl_polytype>(t));
			}
		
		for(const sid i : select_all(symbolref::symbolreftype::t_construct))
			s = conss[index[i].i]->declare_type(c).composite(s);
		
		ltypecontext corig = c;
		
		for(const sid i : select_all(symbolref::symbolreftype::t_var))
		{
			ltypecontext ctmp = corig;
			s = vars[index[i].i]->declare_type(ctmp).composite(s);
			c.register_type(i, ctmp[i]); //Copy result from ctmp to c;
		}
		
		for(const sid i : select_all(symbolref::symbolreftype::t_fun))
		{
			ltypecontext ctmp = corig;
			s = funs[index[i].i]->declare_type(ctmp).composite(s);
			c.register_type(i, ctmp[i]); //Copy result from ctmp to c;
		}
		
		std::vector<sid> prop_index;
		for(const std::pair<sid, s_ptr<const sl_polytype_exists>> p : init_types)
			prop_index.push_back(p.first);
		
		while(!prop_index.empty())
		{
			bool changed = false;
			
			for(size_t i = 0; i < prop_index.size(); i++)
			{
				const s_ptr<const sl_polytype_exists> t = init_types[prop_index[i]];
				
				std::vector<s_ptr<const sl_type_unbound>> blacklist;
				for(size_t j = 0; j < prop_index.size(); j++)
					if(i != j)
						for(const auto tmp : init_types[prop_index[j]]->fetch_bindings())
							add_to<s_ptr<const sl_type_unbound>>(tmp->apply(s)->tv(), blacklist);
				
				if(any_is_in_ptr<const sl_type_unbound>(std::dynamic_pointer_cast<const sl_polytype_forall>(c[prop_index[i]])->unbind_maintain()->apply(s)->tv(), blacklist))
					continue;
	
				s = t->propagate_findings(c, c[prop_index[i]]->apply(c, s), s);
				
				prop_index.erase(prop_index.begin()+i);
				i--;
				
				changed = true;
				break;
			}
			
			if(!prop_index.empty() && !changed)
			{
				for(size_t i = 0; i < prop_index.size(); i++)
				{
					print_name(prop_index[i], std::cout << std::endl);
					for(const auto t : std::dynamic_pointer_cast<const sl_polytype_forall>(c[prop_index[i]])->unbind_maintain()->apply(s)->tv())
						t->print(std::cout << ' ');
				}
				throw std::runtime_error("Cyclic dependency in definitions, cannot infer type");
			}
		}
		
		for(const sid i : select_all(symbolref::symbolreftype::t_type))
			c.register_type(i, sl_polytype::not_qualify(c.create_fresh(sloc())));
		
		typecontext gtmp = global->apply_maintain(s);
		substitution stmp;
		
		for(const sid i : select_all(symbolref::symbolreftype::t_var))
		{
			gtmp = gtmp.apply(stmp);
			stmp = vars[index[i].i]->fetch_assigned_type(gtmp)->unify(gtmp[i]->unbind(gtmp)).composite(stmp);
		}
		
		for(const sid i : select_all(symbolref::symbolreftype::t_fun))
		{
			gtmp = gtmp.apply(stmp);
			stmp = funs[index[i].i]->fetch_assigned_type(gtmp)->unify(gtmp[i]->unbind(gtmp)).composite(stmp);
		}
		
		for(const sid i : select_all(symbolref::symbolreftype::t_arg))
		{
			gtmp = gtmp.apply(stmp);
			stmp = args[index[i].i]->fetch_assigned_type(gtmp)->unify(gtmp[i]->unbind(gtmp)).composite(stmp);
		}
		
		for(const sid i : select_all(symbolref::symbolreftype::t_local_var))
		{
			gtmp = gtmp.apply(stmp);
			stmp = local_vars[index[i].i]->fetch_assigned_type(gtmp)->unify(gtmp[i]->unbind(gtmp)).composite(stmp);
		}
		
		print(global->apply_maintain(stmp.composite(s)), std::cout << "Typecontext final: " << std::endl);
	}