Add error code no expression, remove some bad code
parent
5b3da83715
commit
6be1f56288
|
@ -566,7 +566,7 @@ bool CBotClass::CompileDefItem(CBotToken* &p, CBotCStack* pStack, bool bSecond)
|
||||||
if ( p->GetType() != ID_CLBRK )
|
if ( p->GetType() != ID_CLBRK )
|
||||||
{
|
{
|
||||||
i = CBotExpression::Compile( p, pStack ); // expression for the value
|
i = CBotExpression::Compile( p, pStack ); // expression for the value
|
||||||
if (i == nullptr || pStack->GetType() >= CBotTypBoolean) // must be a number
|
if (i == nullptr || pStack->GetType() != CBotTypInt) // must be a number
|
||||||
{
|
{
|
||||||
pStack->SetError(CBotErrBadIndex, p->GetStart());
|
pStack->SetError(CBotErrBadIndex, p->GetStart());
|
||||||
return false;
|
return false;
|
||||||
|
@ -681,9 +681,9 @@ bool CBotClass::CompileDefItem(CBotToken* &p, CBotCStack* pStack, bool bSecond)
|
||||||
if ( IsOfType(p, ID_ASS ) )
|
if ( IsOfType(p, ID_ASS ) )
|
||||||
{
|
{
|
||||||
pStack->SetStartError(p->GetStart());
|
pStack->SetStartError(p->GetStart());
|
||||||
if ( IsOfTypeList(p, TokenTypVar, ID_NEW, ID_SEP, 0) ) // no var, new, or ';'
|
if ( IsOfType(p, ID_SEP) )
|
||||||
{
|
{
|
||||||
pStack->SetError(CBotErrBadLeft, p->GetPrev());
|
pStack->SetError(CBotErrNoExpression, p->GetPrev());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if ( type.Eq(CBotTypArrayPointer) )
|
if ( type.Eq(CBotTypArrayPointer) )
|
||||||
|
|
|
@ -235,6 +235,7 @@ enum CBotError : int
|
||||||
CBotErrBadIndex = 5040, //!< wrong index type "[ false ]"
|
CBotErrBadIndex = 5040, //!< wrong index type "[ false ]"
|
||||||
CBotErrPrivate = 5041, //!< protected item
|
CBotErrPrivate = 5041, //!< protected item
|
||||||
CBotErrNoPublic = 5042, //!< missing word "public"
|
CBotErrNoPublic = 5042, //!< missing word "public"
|
||||||
|
CBotErrNoExpression = 5043, //!< expression expected after =
|
||||||
|
|
||||||
// Runtime errors
|
// Runtime errors
|
||||||
CBotErrZeroDiv = 6000, //!< division by zero
|
CBotErrZeroDiv = 6000, //!< division by zero
|
||||||
|
|
|
@ -76,7 +76,7 @@ CBotInstr* CBotDefArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResul
|
||||||
if (p->GetType() != ID_CLBRK)
|
if (p->GetType() != ID_CLBRK)
|
||||||
{
|
{
|
||||||
i = CBotExpression::Compile(p, pStk); // expression for the value
|
i = CBotExpression::Compile(p, pStk); // expression for the value
|
||||||
if (i == nullptr || pStk->GetType() >= CBotTypBoolean) // must be a number
|
if (i == nullptr || pStk->GetType() != CBotTypInt) // must be a number
|
||||||
{
|
{
|
||||||
pStk->SetError(CBotErrBadIndex, p->GetStart());
|
pStk->SetError(CBotErrBadIndex, p->GetStart());
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -106,7 +106,7 @@ CBotInstr* CBotDefArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResul
|
||||||
pStk->SetStartError(p->GetStart());
|
pStk->SetStartError(p->GetStart());
|
||||||
if ( IsOfType(p, ID_SEP) )
|
if ( IsOfType(p, ID_SEP) )
|
||||||
{
|
{
|
||||||
pStk->SetError(CBotErrBadLeft, p->GetPrev());
|
pStk->SetError(CBotErrNoExpression, p->GetPrev());
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if ( nullptr == (inst->m_listass = CBotListArray::Compile(p, pStk, type.GetTypElem())) )
|
if ( nullptr == (inst->m_listass = CBotListArray::Compile(p, pStk, type.GetTypElem())) )
|
||||||
|
|
|
@ -90,7 +90,7 @@ CBotInstr* CBotDefBoolean::Compile(CBotToken* &p, CBotCStack* pStack, bool cont,
|
||||||
pStk->SetStartError(p->GetStart());
|
pStk->SetStartError(p->GetStart());
|
||||||
if ( IsOfType(p, ID_SEP) )
|
if ( IsOfType(p, ID_SEP) )
|
||||||
{
|
{
|
||||||
pStk->SetError(CBotErrBadLeft, p->GetPrev());
|
pStk->SetError(CBotErrNoExpression, p->GetPrev());
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
|
if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
|
||||||
|
|
|
@ -157,7 +157,7 @@ CBotInstr* CBotDefClass::Compile(CBotToken* &p, CBotCStack* pStack, CBotClass* p
|
||||||
pStk->SetStartError(p->GetStart());
|
pStk->SetStartError(p->GetStart());
|
||||||
if ( IsOfType(p, ID_SEP) )
|
if ( IsOfType(p, ID_SEP) )
|
||||||
{
|
{
|
||||||
pStk->SetError(CBotErrBadLeft, p->GetPrev());
|
pStk->SetError(CBotErrNoExpression, p->GetPrev());
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (inst->m_hasParams)
|
if (inst->m_hasParams)
|
||||||
|
|
|
@ -89,7 +89,7 @@ CBotInstr* CBotDefFloat::Compile(CBotToken* &p, CBotCStack* pStack, bool cont, b
|
||||||
pStk->SetStartError(p->GetStart());
|
pStk->SetStartError(p->GetStart());
|
||||||
if ( IsOfType(p, ID_SEP) )
|
if ( IsOfType(p, ID_SEP) )
|
||||||
{
|
{
|
||||||
pStk->SetError(CBotErrBadLeft, p->GetPrev());
|
pStk->SetError(CBotErrNoExpression, p->GetPrev());
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
|
if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
|
||||||
|
|
|
@ -93,7 +93,7 @@ CBotInstr* CBotDefInt::Compile(CBotToken* &p, CBotCStack* pStack, bool cont, boo
|
||||||
pStk->SetStartError(p->GetStart());
|
pStk->SetStartError(p->GetStart());
|
||||||
if ( IsOfType(p, ID_SEP) )
|
if ( IsOfType(p, ID_SEP) )
|
||||||
{
|
{
|
||||||
pStk->SetError(CBotErrBadLeft, p->GetPrev());
|
pStk->SetError(CBotErrNoExpression, p->GetPrev());
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
|
if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
|
||||||
|
|
|
@ -93,7 +93,7 @@ CBotInstr* CBotDefString::Compile(CBotToken* &p, CBotCStack* pStack, bool cont,
|
||||||
pStk->SetStartError(p->GetStart());
|
pStk->SetStartError(p->GetStart());
|
||||||
if ( IsOfType(p, ID_SEP) )
|
if ( IsOfType(p, ID_SEP) )
|
||||||
{
|
{
|
||||||
pStk->SetError(CBotErrBadLeft, p->GetPrev());
|
pStk->SetError(CBotErrNoExpression, p->GetPrev());
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
|
if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
|
||||||
|
|
|
@ -45,7 +45,7 @@ CBotListArray::~CBotListArray()
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
CBotInstr* CBotListArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResult type, bool classItem)
|
CBotInstr* CBotListArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResult type)
|
||||||
{
|
{
|
||||||
CBotCStack* pStk = pStack->TokenStack(p);
|
CBotCStack* pStk = pStack->TokenStack(p);
|
||||||
|
|
||||||
|
@ -69,58 +69,33 @@ CBotInstr* CBotListArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResu
|
||||||
if (type.Eq( CBotTypArrayPointer ))
|
if (type.Eq( CBotTypArrayPointer ))
|
||||||
{
|
{
|
||||||
pStk->SetStartError(p->GetStart());
|
pStk->SetStartError(p->GetStart());
|
||||||
if (p->GetType() == TokenTypVar)
|
if ( nullptr == (inst->m_expr = CBotListArray::Compile(p, pStk, type.GetTypElem())) )
|
||||||
{
|
{
|
||||||
if (!classItem)
|
if (pStk->IsOk())
|
||||||
{
|
{
|
||||||
inst->m_expr = CBotTwoOpExpr::Compile(p, pStk);
|
inst->m_expr = CBotTwoOpExpr::Compile(p, pStk);
|
||||||
if (!pStk->GetTypResult().Compare(type)) // compatible type ?
|
if (inst->m_expr == nullptr || !pStk->GetTypResult().Compare(type)) // compatible type ?
|
||||||
{
|
{
|
||||||
pStk->SetError(CBotErrBadType1, p->GetStart());
|
pStk->SetError(CBotErrBadType1, p->GetStart());
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
pStk->SetError(CBotErrBadLeft, p->GetPrev());
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (nullptr == ( inst->m_expr = CBotListArray::Compile( p, pStk, type.GetTypElem() ) ))
|
|
||||||
{
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
while (IsOfType( p, ID_COMMA )) // other elements?
|
while (IsOfType( p, ID_COMMA )) // other elements?
|
||||||
{
|
{
|
||||||
pStk->SetStartError(p->GetStart());
|
pStk->SetStartError(p->GetStart());
|
||||||
CBotInstr* i = nullptr;
|
CBotInstr* i = nullptr;
|
||||||
if (p->GetType() == TokenTypVar)
|
if ( nullptr == (i = CBotListArray::Compile(p, pStk, type.GetTypElem())) )
|
||||||
{
|
{
|
||||||
if (!classItem)
|
if (pStk->IsOk())
|
||||||
{
|
{
|
||||||
i = CBotTwoOpExpr::Compile(p, pStk);
|
i = CBotTwoOpExpr::Compile(p, pStk);
|
||||||
if (nullptr == i || !pStk->GetTypResult().Compare(type)) // compatible type ?
|
if (i == nullptr || !pStk->GetTypResult().Compare(type)) // compatible type ?
|
||||||
{
|
{
|
||||||
pStk->SetError(CBotErrBadType1, p->GetStart());
|
pStk->SetError(CBotErrBadType1, p->GetStart());
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
pStk->SetError(CBotErrBadLeft, p->GetPrev());
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
i = CBotListArray::Compile(p, pStk, type.GetTypElem());
|
|
||||||
if (nullptr == i)
|
|
||||||
{
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
inst->m_expr->AddNext3(i);
|
inst->m_expr->AddNext3(i);
|
||||||
if ( p->GetType() == ID_COMMA ) continue;
|
if ( p->GetType() == ID_COMMA ) continue;
|
||||||
|
@ -133,23 +108,15 @@ CBotInstr* CBotListArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResu
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pStk->SetStartError(p->GetStart());
|
pStk->SetStartError(p->GetStart());
|
||||||
if (classItem && IsOfType(p, TokenTypVar, ID_NEW)) // don't allow func() or var between "{ }"
|
|
||||||
{
|
|
||||||
pStk->SetError(CBotErrBadLeft, p->GetPrev());
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
|
if (nullptr == ( inst->m_expr = CBotTwoOpExpr::Compile( p, pStk )))
|
||||||
{
|
{
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
CBotVar* pv = pStk->GetVar(); // result of the expression
|
CBotVar* pv = pStk->GetVar(); // result of the expression
|
||||||
CBotTypResult retType;
|
|
||||||
if (pv != nullptr) retType = pv->GetTypResult(CBotVar::GetTypeMode::CLASS_AS_INTRINSIC);
|
|
||||||
|
|
||||||
if (pv == nullptr || (type.Eq(CBotTypString) && !retType.Eq(CBotTypString)) ||
|
if (pv == nullptr || (!TypesCompatibles( type, pv->GetTypResult()) &&
|
||||||
(!(type.Eq(CBotTypPointer) && retType.Eq(CBotTypNullPointer)) &&
|
!(type.Eq(CBotTypPointer) && pv->GetTypResult().Eq(CBotTypNullPointer))) ) // compatible type?
|
||||||
!TypesCompatibles( type, pv->GetTypResult()) &&
|
|
||||||
!TypeCompatible(type, retType, ID_ASS) ) ) // compatible type?
|
|
||||||
{
|
{
|
||||||
pStk->SetError(CBotErrBadType1, p->GetStart());
|
pStk->SetError(CBotErrBadType1, p->GetStart());
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -159,12 +126,6 @@ CBotInstr* CBotListArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResu
|
||||||
{
|
{
|
||||||
pStk->SetStartError(p->GetStart());
|
pStk->SetStartError(p->GetStart());
|
||||||
|
|
||||||
if (classItem && IsOfType(p, TokenTypVar, ID_NEW)) // don't allow func() or var between "{ }"
|
|
||||||
{
|
|
||||||
pStk->SetError(CBotErrBadLeft, p);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
CBotInstr* i = CBotTwoOpExpr::Compile(p, pStk) ;
|
CBotInstr* i = CBotTwoOpExpr::Compile(p, pStk) ;
|
||||||
if (nullptr == i)
|
if (nullptr == i)
|
||||||
{
|
{
|
||||||
|
@ -172,13 +133,9 @@ CBotInstr* CBotListArray::Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResu
|
||||||
}
|
}
|
||||||
|
|
||||||
CBotVar* pv = pStk->GetVar(); // result of the expression
|
CBotVar* pv = pStk->GetVar(); // result of the expression
|
||||||
CBotTypResult retType;
|
|
||||||
if (pv != nullptr) retType = pv->GetTypResult(CBotVar::GetTypeMode::CLASS_AS_INTRINSIC);
|
|
||||||
|
|
||||||
if (pv == nullptr || (type.Eq(CBotTypString) && !retType.Eq(CBotTypString)) ||
|
if (pv == nullptr || (!TypesCompatibles( type, pv->GetTypResult()) &&
|
||||||
(!(type.Eq(CBotTypPointer) && retType.Eq(CBotTypNullPointer)) &&
|
!(type.Eq(CBotTypPointer) && pv->GetTypResult().Eq(CBotTypNullPointer))) ) // compatible type?
|
||||||
!TypesCompatibles( type, pv->GetTypResult()) &&
|
|
||||||
!TypeCompatible(type, retType, ID_ASS) ) ) // compatible type?
|
|
||||||
{
|
{
|
||||||
pStk->SetError(CBotErrBadType1, p->GetStart());
|
pStk->SetError(CBotErrBadType1, p->GetStart());
|
||||||
goto error;
|
goto error;
|
||||||
|
|
|
@ -41,7 +41,7 @@ public:
|
||||||
* \param classItem
|
* \param classItem
|
||||||
* \return
|
* \return
|
||||||
*/
|
*/
|
||||||
static CBotInstr* Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResult type, bool classItem = false);
|
static CBotInstr* Compile(CBotToken* &p, CBotCStack* pStack, CBotTypResult type);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Execute Executes the definition of an array.
|
* \brief Execute Executes the definition of an array.
|
||||||
|
|
|
@ -715,6 +715,7 @@ void InitializeRestext()
|
||||||
stringsCbot[CBot::CBotErrBadIndex] = TR("Incorrect index type");
|
stringsCbot[CBot::CBotErrBadIndex] = TR("Incorrect index type");
|
||||||
stringsCbot[CBot::CBotErrPrivate] = TR("Private element");
|
stringsCbot[CBot::CBotErrPrivate] = TR("Private element");
|
||||||
stringsCbot[CBot::CBotErrNoPublic] = TR("Public required");
|
stringsCbot[CBot::CBotErrNoPublic] = TR("Public required");
|
||||||
|
stringsCbot[CBot::CBotErrNoExpression] = TR("expression expected after =");
|
||||||
|
|
||||||
stringsCbot[CBot::CBotErrZeroDiv] = TR("Dividing by zero");
|
stringsCbot[CBot::CBotErrZeroDiv] = TR("Dividing by zero");
|
||||||
stringsCbot[CBot::CBotErrNotInit] = TR("Variable not initialized");
|
stringsCbot[CBot::CBotErrNotInit] = TR("Variable not initialized");
|
||||||
|
|
Loading…
Reference in New Issue