예제 #1
0
파일: lcont.cpp 프로젝트: iley/intelib
void LispContinuation::EvaluateForm(const SExpressionCons *form)
{
    SExpressionSpecialToken *tk =
        form->Car().DynamicCastGetPtr<SExpressionSpecialToken>();
    if(tk) {
        SExpressionForm *f;
        SReference func;
        tk->GetApplicable(&f, &func, *this);
        if(f) { // special form
            f->Call(form->Cdr(), *this);
        } else {
            if(!func.GetPtr())
                throw IntelibX_no_associated_function(tk);
            PushResult(func);
//#error from might be null pointer... may throw but its not a bug!
            INTELIB_ASSERT(form, IntelibX_unexpected_unbound_value());
            SExpressionCons *cdr =
                form->Cdr().DynamicCastGetPtr<SExpressionCons>();
            if(cdr) {
                PlaceFormToStack(cdr, 1);
            } else {
                PushTodo(0);
            }
        }
    } else {
        // may be it's a lambda-list?
        SExpressionCons *dp = 
            form->Car().DynamicCastGetPtr<SExpressionCons>();
        if(dp) {
            if(dp->Car() == *PTheLispSymbolLambda) {
                LReference tmp = dp->Cdr(); 
                PushResult(new LExpressionLambda(GetContext(),
                                                 tmp.Car(), 
                                                 tmp.Cdr()));
                SExpressionCons *cdr =
                    form->Cdr().DynamicCastGetPtr<SExpressionCons>();
                if(cdr) {
                    PlaceFormToStack(cdr, 1);
                } else {
                    PushTodo(0);
                }
            } else {
                throw IntelibX_not_a_function(form->Car());
            }
        }
        // okay, the last chance is that it is just a function...
        // let's place it to the stack, may be it will work
        PlaceFormToStack(form, 0);
    }
}
예제 #2
0
파일: lcont.cpp 프로젝트: iley/intelib
void LispContinuation::CustomCommand(int opcode, const SReference& param)
{
    switch(opcode) {
        case take_result_as_form: {
            SReference r;
            PopResult(r);
            PushTodo(just_evaluate, r);
            break;
        }
        case duplicate_last_result: {
            SReference r;
            PopResult(r);
            PushResult(r);
            PushResult(r);
            break;
        }
        default:
                // this will just throw an exception
            IntelibContinuation::CustomCommand(opcode, param);
    }
}
//************************************************************************************
void CBCGPOutlineParser::DoParse (const CString& strBuffer, 
								  const int nStartOffset, const int nEndOffset, 
								  CObList& lstResults)
{
	ASSERT (nStartOffset >= 0);
	ASSERT (nEndOffset < strBuffer.GetLength ());
	ASSERT (nStartOffset <= nEndOffset);

	m_strOut.Empty ();

	CList <Lexeme, Lexeme&> lstStack;
	Lexeme lexemStackTop (0, LT_Eps, 0, 0);
	lstStack.AddTail (lexemStackTop);

	int nOffset	= nStartOffset;

	while (nOffset <= nEndOffset)
	{
		// Get next lexem:
		Lexeme lexemNext = GetNext (strBuffer, nOffset, nEndOffset);
		Lexeme lexemTop = lstStack.GetTail ();

		if (lexemNext.m_nType == LT_EndOfText)
		{
			break;
		}

		// Parser logic:
		switch (lexemNext.m_nType)
		{
		case LT_BlockStart:
			lstStack.AddTail (lexemNext);
			break;
		case LT_BlockEnd:
			if (lexemTop.m_nType == LT_BlockStart &&
				lexemTop.m_nBlockType == lexemNext.m_nBlockType)
			{
				// Push Block:
				lstStack.RemoveTail ();
				Lexeme lexemRes (lexemTop.m_nBlockType, LT_CompleteBlock, lexemTop.m_nStart, lexemNext.m_nEnd);
				PushResult (lexemRes, lstResults);
			}
			else
			{
				lstStack.AddTail (lexemNext);
			}
			break;
		case LT_CompleteBlock:
			{
				// Push Comment:
				PushResult (lexemNext, lstResults);
			}
			break;

		case LT_CustomBlock:
			break;
		}
	}
	
	// Finish parsing:
	while (!lstStack.IsEmpty ())
	{
		Lexeme lexem = lstStack.RemoveTail ();
		PushResult (lexem, lstResults);
	}
}
예제 #4
0
파일: tskmngr.cpp 프로젝트: Mileslee/wxgis
void wxGISTaskManager::OnGisNetEvent(wxGISNetEvent& event)
{
    wxNetMessage msg = event.GetNetMessage();
    wxString sErrMsg;
    switch(msg.GetCommand())
    {
    case enumGISNetCmdBye: //server disconnected
        DeleteAllTasks();
        //start task manager server
        StartTaskManagerServer();
        //start timer to connect task server
        m_timer.Start(5000, false);
        break;
    case enumGISNetCmdHello:
        {
            wxNetMessage msg(enumGISNetCmdCmd, enumGISCmdGetChildren, enumGISPriorityHigh);
            m_pConn->SendNetMessage(msg);
        //QuereTasks(sErrMsg);
        }
        break;
    case enumGISNetCmdNote:
        //if message id != -1 add to notify
        if(msg.GetId() != wxNOT_FOUND)
        {
            TSKMNGR_RESULT Res = {msg.GetId(), msg.GetMessage(), msg.GetState()};
            PushResult(Res);
        }
        else
        {
            switch(msg.GetState())
            {
            case enumGISNetCmdStOk:
                wxLogMessage(msg.GetMessage());
                break;
            case enumGISNetCmdStErr:
                wxLogError(msg.GetMessage());
                break;
            //case enumGISCmdNoteVol:
            //    UpdateVolume(msg.GetXMLRoot()->GetChildren());
            //    break;
            //case enumGISCmdNotePercent:
            //    UpdatePercent(msg.GetXMLRoot()->GetChildren());
            //    break;
            case enumGISCmdNoteMsg:
                AddMessage(msg.GetXMLRoot()->GetChildren());
                break;
            default:
                wxLogVerbose(msg.GetMessage());
                break;
            }
        }
        break;
    case enumGISNetCmdCmd: //do something usefull
        if(msg.GetId() != wxNOT_FOUND)
        {
            TSKMNGR_RESULT Res = {msg.GetId(), msg.GetMessage(), msg.GetState()};
            PushResult(Res);
        }
        if(msg.GetXMLRoot())
        {
            switch(msg.GetState())
            {
            case enumGISCmdStAdd:
                AddTask(msg.GetXMLRoot()->GetChildren());
                break;
            case enumGISCmdStDel:
                DeleteTask(msg.GetXMLRoot()->GetChildren());
                break;
            case enumGISCmdStStart:
            case enumGISCmdStStop:
            case enumGISCmdStChng:
                ChangeTask(msg.GetXMLRoot()->GetChildren());
                break;
            case enumGISCmdGetChildren:
                LoadTasks(msg.GetXMLRoot()->GetChildren());
                break;
            case enumGISCmdStPriority://TODO: change priority for all task simultaniasly
            default:
                break;
            }
        }
        break;
    default:
        break;
    }
}