void SimilarShapeSegmentPage::apply() {
  TDoubleParam *curve = getCurve();
  if (!curve) return;
  int kIndex = getViewer()->getSegmentIndex();
  if (kIndex < 0) return;

  std::string expressionText = m_expressionFld->getExpression();
  TExpression expr;
  expr.setGrammar(curve->getGrammar());
  expr.setText(expressionText);
  if (!expr.isValid()) {
    DVGui::warning(
        tr("There is a syntax error in the definition of the interpolation."));
    return;
  }
  if (dependsOn(expr, curve)) {
    DVGui::warning(
        tr("There is a circular reference in the definition of the "
           "interpolation."));
    return;
  }
  KeyframeSetter setter(curve, kIndex);
  setter.setSimilarShape(m_expressionFld->getExpression(),
                         m_offsetFld->text().toDouble());
}
Exemplo n.º 2
0
void TLocalVar::AnalyzeSyntax(Lexer::ILexer* source) {
	InitPos(source);
	type->AnalyzeSyntax(source);
	is_static = source->TestAndGet(TResWord::Static);
	assert(parent->GetType()==TStatementType::Statements);
	TStatements* statements = (TStatements*) parent;
	TLocalVar* curr_var = this;
	do {
		if (curr_var != this) {
			curr_var->type = type;
			curr_var->is_static = is_static;
			*(TTokenPos*) curr_var = *(TTokenPos*) this;
		}
		curr_var->name = source->NameId();
		int identifier_token = source->GetCurrentToken();
		source->SetCurrentToken(identifier_token + 1);
		bool is_next_assign = source->Test(
				TOperator::Assign);
		source->SetCurrentToken(identifier_token);
		if (is_next_assign) 
		{
			//source->GetToken(TTokenType::Identifier);
			//source->TestAndGet(TOperator::Assign);
			curr_var->assign_expr.reset(new TExpression(owner, method, parent,
					curr_var->stmt_id));
			curr_var->assign_expr->AnalyzeSyntax(source);
		} else {
			source->GetToken();
			if (source->TestAndGet(TTokenType::LParenth)) 
			{
				while (!source->Test(TTokenType::RParenth)) 
				{
					TExpression* expr = new TExpression(owner, method, parent,
							curr_var->stmt_id);
					expr->AnalyzeSyntax(source);
					curr_var->params.push_back(std::unique_ptr<TExpression>(expr));
					if (!source->TestAndGet(TTokenType::Comma))
						break;
				}
				source->GetToken(TTokenType::RParenth);
			}
		}
		if ((source->Test(TTokenType::Comma) || source->Test(TTokenType::Semicolon)) && (curr_var != this))
		{
			statements->AddVar(curr_var);
			if (curr_var->assign_expr)
				curr_var->assign_expr->SetStmtId(curr_var->stmt_id);
			if (curr_var->params.size() > 0)
			{
				for (const std::unique_ptr<TExpression>& v : curr_var->params)
					v->SetStmtId(curr_var->stmt_id);
			}
		}
		if (source->Test(TTokenType::Comma))
		{
			curr_var = new TLocalVar(owner, method, statements, -1);
		}
	} while (source->TestAndGet(TTokenType::Comma));
}
void FunctionExpressionSegmentPage::apply() {
  TDoubleParam *curve = getCurve();
  if (!curve) return;

  int kIndex = getViewer()->getSegmentIndex();
  if (kIndex < 0) return;

  std::string expressionText = m_expressionFld->getExpression();
  TExpression expr;
  expr.setGrammar(curve->getGrammar());
  expr.setText(expressionText);
  if (dependsOn(expr, curve)) {
    DVGui::warning(
        tr("There is a circular reference in the definition of the "
           "interpolation."));
    return;
  }

  std::string unitName = m_unitFld->text().toStdString();

  KeyframeSetter setter(curve, kIndex);
  setter.setExpression(m_expressionFld->getExpression());
  setter.setUnitName(unitName);

  /*

TDoubleKeyframe kf0 = curve->getKeyframeAt(getR0());
kf0.m_expressionText = m_expressionFld->getExpression();
kf0.m_unitName = m_unitFld->text().toStdString();
curve->setKeyframe(kf0);

wstring unitExtension = m_unitFld->text().toStdWString();
TMeasure *curveMeasure = curve->getMeasure();
if(curveMeasure)
{
TUnit *unit = curveMeasure->getUnit(unitExtension);
if(unit)
curveMeasure->setCurrentUnit(unit);
else
{
unitExtension = curveMeasure->getCurrentUnit()->getDefaultExtension();
m_unitFld->setText(QString::fromStdWString(unitExtension));
}
}
else
m_unitFld->setText("");
*/
}
/*! return false if a circular reference is occured
*/
bool FunctionExpressionSegmentPage::getGuiValues(std::string &expressionText,
                                                 std::string &unitName) {
  expressionText = m_expressionFld->getExpression();

  // checking a circular reference
  TDoubleParam *curve = getCurve();
  TExpression expr;
  expr.setGrammar(curve->getGrammar());
  expr.setText(expressionText);
  if (dependsOn(expr, curve)) {
    DVGui::warning(
        tr("There is a circular reference in the definition of the "
           "interpolation."));
    return false;
  }

  unitName = m_unitFld->text().toStdString();

  if (m_expressionFld->hasFocus()) m_expressionFld->clearFocus();

  return true;
}
Exemplo n.º 5
0
bool dependsOn(TExpression &expr, TDoubleParam *possiblyDependentParam) {
  ParamDependencyFinder pdf(possiblyDependentParam);
  expr.accept(pdf);
  return pdf.found();
}
Exemplo n.º 6
0
 typename TExpression::adjoint_type adjoint(const TExpression& expression)
 {
   return expression.getAdjoint();
 }
Exemplo n.º 7
0
void TStatements::AnalyzeStatement(Lexer::ILexer* source, bool end_semicolon) {
	switch (source->Type()) {
	case TTokenType::LBrace: {
		TStatements* s = new TStatements(owner, method, this,
				statements.size());
		Add(s);
		s->AnalyzeSyntax(source);
		return;
	}
	case TTokenType::ResWord: {
		switch (source->Token()) {
		case TResWord::Return: {
			TReturn* t = new TReturn(owner, method, this, statements.size());
			Add(t);
			t->AnalyzeSyntax(source);
			if (!end_semicolon)
				source->Error("return можно использовать только как отдельную инструкцию!");
			source->GetToken(TTokenType::Semicolon);
			return;
		}
		case TResWord::If: {
			TIf* t = new TIf(owner, method, this, statements.size());
			Add(t);
			t->AnalyzeSyntax(source);
			return;
		}
		case TResWord::For: {
			source->GetToken(TResWord::For);
			source->GetToken(TTokenType::LParenth);

			TStatements* for_stmt = new TStatements(owner, method, this,
					statements.size());
			Add(for_stmt);

			TFor* t =
					new TFor(owner, method, for_stmt, for_stmt->GetHigh()+1);
			for_stmt->AnalyzeSyntax(source);
			for_stmt->Add(t);

			t->AnalyzeSyntax(source);
			return;
		}
		case TResWord::While: {
			TWhile* t = new TWhile(owner, method, this, statements.size());
			Add(t);
			t->AnalyzeSyntax(source);
			return;
		}
		case TResWord::This: {
			TExpression* t = new TExpression(owner, method, this,
					statements.size());
			Add(t);
			t->AnalyzeSyntax(source);
			if (end_semicolon)
				source->GetToken(TTokenType::Semicolon);
			return;
		}
		case TResWord::Bytecode: {
			TBytecode* t = new TBytecode(owner, method, this,
					statements.size());
			Add(t);
			t->AnalyzeSyntax(source);
			if (end_semicolon)
				source->GetToken(TTokenType::Semicolon);
			return;
		}
		}
		source->Error("Ожидался return,if,for,bytecode или this!");
	}
	default:
		if (IsVarDecl(source)) {
			TLocalVar* t = new TLocalVar(owner, method, this,
					statements.size());
			Add(t);
			t->AnalyzeSyntax(source);
		} else {
			TExpression* t = new TExpression(owner, method, this,
					statements.size());
			Add(t);
			t->AnalyzeSyntax(source);
		}
		if (end_semicolon)
			source->GetToken(TTokenType::Semicolon);
		return;
	}
	assert(false);//во всех switch должен быть return 
}