From b2c9337990ed6130945afed31abd22e4d32672c9 Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Fri, 11 Feb 2022 21:46:09 +0100 Subject: [PATCH] PARSER: Create const expr from a single token --- src/Lib/Script/Ast/IrExpression.cc | 31 +++++++++++++++++------ src/Lib/Script/Ast/IrExpression.hh | 4 +-- src/Lib/Script/Ast/Parser/IrExpression.hh | 2 +- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/Lib/Script/Ast/IrExpression.cc b/src/Lib/Script/Ast/IrExpression.cc index b3086532..10cf3fe1 100644 --- a/src/Lib/Script/Ast/IrExpression.cc +++ b/src/Lib/Script/Ast/IrExpression.cc @@ -94,11 +94,28 @@ IrEConstExpr::IrEConstExpr(const Token &singleElement) : IrExpression(nullptr, Type::ConstExpr) { switch (singleElement.valueType()) { - case Token::Type::INTEGER: - case Token::Type::FLOATING: - case Token::Type::COLORLIT: + case Token::Type::INTEGER: { + setInnerType(IrElement::create<IrTPrimitive>(this, IrType::PrimitiveType::Int)); + inner.integer = singleElement.asInteger(); + return; + } + + case Token::Type::FLOATING: { + setInnerType(IrElement::create<IrTPrimitive>(this, IrType::PrimitiveType::Float)); + inner.floating = singleElement.asFloating(); + return; + } + + case Token::Type::COLORLIT: { + setInnerType(IrElement::create<IrTPrimitive>(this, IrType::PrimitiveType::Color)); + inner.string = singleElement.asColorLit(); + return; + } + case Token::Type::STRINGLIT: { - throw std::logic_error("IrEConstExpr: not implemented " + singleElement.toString()); + setInnerType(IrElement::create<IrTPrimitive>(this, IrType::PrimitiveType::String)); + inner.string = singleElement.asStringLit(); + return; } /* Only handle true or false */ @@ -115,9 +132,7 @@ IrEConstExpr::IrEConstExpr(const Token &singleElement) } case Token::Type::QNAME: - default: { - throw std::logic_error("IrEConstExpr unexpected token: " + singleElement.toString()); - } + default: throw std::logic_error("IrEConstExpr unexpected token: " + singleElement.toString()); } } @@ -141,7 +156,7 @@ IrEConstExpr::getInnerInteger() const return inner.integer; } -float +double IrEConstExpr::getInnerFloating() const { innerType()->assertInnerType(IrType::PrimitiveType::Float); diff --git a/src/Lib/Script/Ast/IrExpression.hh b/src/Lib/Script/Ast/IrExpression.hh index 5df659d5..93ea0f69 100644 --- a/src/Lib/Script/Ast/IrExpression.hh +++ b/src/Lib/Script/Ast/IrExpression.hh @@ -38,7 +38,7 @@ class IrEConstExpr : public IrExpression { union { bool boolean; int integer; - float floating; + double floating; /* StringLit + ColorLit */ StrV string = STRV_NULL; @@ -50,7 +50,7 @@ public: bool getInnerBoolean() const; int getInnerInteger() const; - float getInnerFloating() const; + double getInnerFloating() const; StrV getInnerStringLit() const; StrV getInnerColorLit() const; }; diff --git a/src/Lib/Script/Ast/Parser/IrExpression.hh b/src/Lib/Script/Ast/Parser/IrExpression.hh index 7abd0495..57bcbd04 100644 --- a/src/Lib/Script/Ast/Parser/IrExpression.hh +++ b/src/Lib/Script/Ast/Parser/IrExpression.hh @@ -1,3 +1,3 @@ /* In: std::vector<Token>* tokens */ -throw std::logic_error("Parser/IrExpression: Not implemented"); \ No newline at end of file +throw std::logic_error("Parser/IrExpression: Not implemented"); -- GitLab