aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-03-27 02:28:29 +0100
committerYann Herklotz <ymherklotz@gmail.com>2017-03-27 02:28:29 +0100
commita7c5f260391da944bd0779e8ac6efb2f0f6b5a6b (patch)
treec64a6d0096a1dc4ee3a0a3fff7649ae1df52dff8
parente9657092063e786a52fefcfa4c528bac07472908 (diff)
downloadCompiler-a7c5f260391da944bd0779e8ac6efb2f0f6b5a6b.tar.gz
Compiler-a7c5f260391da944bd0779e8ac6efb2f0f6b5a6b.zip
Working even more
-rw-r--r--c_compiler/include/bindings.hpp18
-rw-r--r--c_compiler/include/declaration.hpp8
-rw-r--r--c_compiler/include/expression.hpp90
-rw-r--r--c_compiler/include/function.hpp4
-rw-r--r--c_compiler/include/node.hpp4
-rw-r--r--c_compiler/include/statement.hpp30
-rw-r--r--c_compiler/include/translation_unit.hpp2
-rw-r--r--c_compiler/include/type.hpp40
-rw-r--r--c_compiler/src/bindings.cpp49
-rw-r--r--c_compiler/src/c_lexer.flex13
-rw-r--r--c_compiler/src/c_parser.y8
-rw-r--r--c_compiler/src/compiler_main.cpp2
-rw-r--r--c_compiler/src/declaration.cpp8
-rw-r--r--c_compiler/src/expression.cpp138
-rw-r--r--c_compiler/src/function.cpp22
-rw-r--r--c_compiler/src/statement.cpp30
-rw-r--r--c_compiler/src/translation_unit.cpp2
-rw-r--r--c_compiler/src/type.cpp32
-rwxr-xr-xrun_test_deliverable.sh14
-rw-r--r--test_deliverable/testcases/test_MAINPRINT0.c7
-rw-r--r--test_deliverable/testcases/test_MAINPRINT0_driver.c1
-rw-r--r--test_deliverable/testcases/test_MAINPRINTF.c8
-rw-r--r--test_deliverable/testcases/test_MAINPRINTF_driver.c1
-rw-r--r--test_deliverable/testcases/test_SHORTADD.c5
-rw-r--r--test_deliverable/testcases/test_SHORTADD_driver.c6
-rw-r--r--test_deliverable/testcases/test_STRINGLIT.c5
-rw-r--r--test_deliverable/testcases/test_STRINGLIT_driver.c9
27 files changed, 350 insertions, 206 deletions
diff --git a/c_compiler/include/bindings.hpp b/c_compiler/include/bindings.hpp
index 9383d5d..d99d97b 100644
--- a/c_compiler/include/bindings.hpp
+++ b/c_compiler/include/bindings.hpp
@@ -1,15 +1,15 @@
#ifndef BINDINGS_HPP
#define BINDINGS_HPP
-#include <map>
#include <memory>
#include <string>
+#include <unordered_map>
+#include <vector>
class Type;
typedef std::shared_ptr<Type> TypePtr;
-
// struct containing information on the variable declaration
struct DeclarationData
{
@@ -17,21 +17,22 @@ struct DeclarationData
int stack_position;
};
-
// stores bindings for the current scope and where they are in the stack
-class VariableStackBindings
+class Bindings
{
private:
- std::map<std::string, DeclarationData> bindings_;
+ static std::vector<std::string> string_literals;
+
+ std::unordered_map<std::string, DeclarationData> bindings_;
std::string break_label_;
std::string continue_label_;
int stack_counter_;
int expression_stack_;
-
public:
- VariableStackBindings();
+ Bindings();
void insertBinding(const std::string &id, TypePtr type, const int &stack_position);
+ int insertStringLiteral(const std::string &string_literal);
void increaseStackPosition();
void increaseStackPosition(const int &position);
void setStackPosition(const int &stack_counter);
@@ -49,6 +50,9 @@ public:
int stackPosition(const std::string &id) const;
int currentExpressionStackPosition() const;
+ std::pair<std::vector<std::string>::const_iterator, std::vector<std::string>::const_iterator>
+ getStringLiteralIterator() const;
+
bool bindingExists(const std::string &id) const;
};
diff --git a/c_compiler/include/declaration.hpp b/c_compiler/include/declaration.hpp
index 9080a47..5c8771b 100644
--- a/c_compiler/include/declaration.hpp
+++ b/c_compiler/include/declaration.hpp
@@ -26,8 +26,8 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
- virtual VariableStackBindings localAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual Bindings localAsm(Bindings bindings, int &label_count) const;
virtual void countDeclarations(int &declaration_count) const;
void linkDeclaration(Declaration *next_declaration);
@@ -51,8 +51,8 @@ private:
public:
ArrayDeclaration(const std::string &id = "", ExpressionPtr initializer = nullptr, const int &size = 0);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
- virtual VariableStackBindings localAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual Bindings localAsm(Bindings bindings, int &label_count) const;
virtual void countDeclarations(int &declaration_count) const;
};
diff --git a/c_compiler/include/expression.hpp b/c_compiler/include/expression.hpp
index 69ff9e2..c784de7 100644
--- a/c_compiler/include/expression.hpp
+++ b/c_compiler/include/expression.hpp
@@ -18,7 +18,7 @@ private:
ExpressionPtr next_expression_;
public:
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int& label_count) const = 0;
+ virtual Bindings printAsm(Bindings bindings, int& label_count) const = 0;
virtual int constantFold() const;
virtual void print() const;
@@ -26,7 +26,7 @@ public:
virtual void countArguments(int &argument_count) const;
virtual void expressionDepth(int &depth_count) const;
virtual std::string id() const;
- virtual TypePtr getType(const VariableStackBindings &bindings) const = 0;
+ virtual TypePtr getType(const Bindings &bindings) const = 0;
void linkExpression(Expression* next_expression);
ExpressionPtr nextExpression() const;
@@ -41,22 +41,24 @@ public:
OperationExpression(Expression *lhs, Expression *rhs);
OperationExpression(ExpressionPtr lhs, Expression *rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const = 0;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0;
virtual int constantFold() const;
virtual void expressionDepth(int &depth_count) const;
- virtual TypePtr getType(const VariableStackBindings &bindings) const;
+ virtual TypePtr getType(const Bindings &bindings) const;
ExpressionPtr getLhs() const;
ExpressionPtr getRhs() const;
- void evaluateExpression(VariableStackBindings bindings, int &label_count) const;
+ void evaluateExpression(Bindings bindings, int &label_count) const;
};
class UnaryExpression : public Expression
{
public:
- virtual void stackPosition(VariableStackBindings bindings, int &depth_count) const;
+ virtual void expressionDepth(int &depth_count) const;
+ virtual void pointerPosition(Bindings bindings) const;
+ virtual void stackPosition(Bindings bindings, int &depth_count) const;
};
class PostfixArrayElement : public UnaryExpression
@@ -68,10 +70,10 @@ private:
public:
PostfixArrayElement(Expression *postfix_expression, Expression *index_expression);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual void expressionDepth(int &depth_count) const;
- virtual void stackPosition(VariableStackBindings bindings, int &depth_count) const;
- virtual TypePtr getType(const VariableStackBindings &bindings) const;
+ virtual void stackPosition(Bindings bindings, int &depth_count) const;
+ virtual TypePtr getType(const Bindings &bindings) const;
};
class PostfixFunctionCall : public UnaryExpression
@@ -83,10 +85,10 @@ private:
public:
PostfixFunctionCall(Expression *argument_expression_list = nullptr);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual void countArguments(int &argument_count) const;
virtual void expressionDepth(int &depth_count) const;
- virtual TypePtr getType(const VariableStackBindings &bindings) const;
+ virtual TypePtr getType(const Bindings &bindings) const;
void setPostfixExpression(Expression *postfix_expression);
};
@@ -100,8 +102,8 @@ private:
public:
PostfixPostIncDecExpression(const std::string &_operator, Expression *postfix_expression);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
- virtual TypePtr getType(const VariableStackBindings &bindings) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual TypePtr getType(const Bindings &bindings) const;
};
@@ -114,8 +116,8 @@ private:
public:
UnaryPreIncDecExpression(const std::string &_operator, Expression *unary_expression);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
- virtual TypePtr getType(const VariableStackBindings &bindings) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual TypePtr getType(const Bindings &bindings) const;
};
class OperatorUnaryExpression : public UnaryExpression
@@ -127,9 +129,9 @@ private:
public:
OperatorUnaryExpression(const std::string &_operator, Expression *cast_expression);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
- virtual void stackPosition(VariableStackBindings bindings, int &depth_count) const;
- virtual TypePtr getType(const VariableStackBindings &bindings) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual void stackPosition(Bindings bindings, int &depth_count) const;
+ virtual TypePtr getType(const Bindings &bindings) const;
};
@@ -142,9 +144,9 @@ private:
public:
CastExpression(Type *type, Expression *expression);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual void expressionDepth(int &depth_count) const;
- virtual TypePtr getType(const VariableStackBindings &bindings) const;
+ virtual TypePtr getType(const Bindings &bindings) const;
};
class AdditiveExpression : public OperationExpression
@@ -155,7 +157,7 @@ private:
public:
AdditiveExpression(Expression *lhs, const std::string &_operator, Expression *rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual int constantFold() const;
};
@@ -167,7 +169,7 @@ private:
public:
MultiplicativeExpression(Expression *lhs, const std::string &_operator, Expression *rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual int constantFold() const;
};
@@ -178,7 +180,7 @@ private:
public:
ShiftExpression(Expression *lhs, const std::string &_operator, Expression *rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual int constantFold() const;
};
@@ -189,7 +191,7 @@ private:
public:
RelationalExpression(Expression *lhs, const std::string &_operator, Expression *rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual int constantFold() const;
};
@@ -200,7 +202,7 @@ private:
public:
EqualityExpression(Expression *lhs, const std::string &_operator, Expression *rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual int constantFold() const;
};
@@ -209,7 +211,7 @@ class AndExpression : public OperationExpression
public:
AndExpression(Expression *lhs, Expression *rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual int constantFold() const;
};
@@ -218,7 +220,7 @@ class ExclusiveOrExpression : public OperationExpression
public:
ExclusiveOrExpression(Expression *lhs, Expression *rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual int constantFold() const;
};
@@ -227,7 +229,7 @@ class InclusiveOrExpression : public OperationExpression
public:
InclusiveOrExpression(Expression *lhs, Expression *rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual int constantFold() const;
};
@@ -236,7 +238,7 @@ class LogicalAndExpression : public OperationExpression
public:
LogicalAndExpression(Expression *lhs, Expression *rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual int constantFold() const;
};
@@ -245,7 +247,7 @@ class LogicalOrExpression : public OperationExpression
public:
LogicalOrExpression(Expression *lhs, Expression *rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual int constantFold() const;
};
@@ -260,8 +262,8 @@ public:
ConditionalExpression(Expression *logical_or, Expression *expression,
Expression *conditional_expression);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
- virtual TypePtr getType(const VariableStackBindings &bindings) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual TypePtr getType(const Bindings &bindings) const;
};
class AssignmentExpression : public OperationExpression
@@ -270,7 +272,7 @@ public:
AssignmentExpression(Expression *lhs, Expression *rhs);
AssignmentExpression(ExpressionPtr lhs, Expression *rhs);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
};
class Identifier : public UnaryExpression
@@ -280,10 +282,22 @@ private:
public:
Identifier(const std::string &id);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
- virtual void stackPosition(VariableStackBindings bindings, int &depth_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual void pointerPosition(Bindings bindings) const;
+ virtual void stackPosition(Bindings bindings, int &depth_count) const;
virtual std::string id() const;
- virtual TypePtr getType(const VariableStackBindings &bindings) const;
+ virtual TypePtr getType(const Bindings &bindings) const;
+};
+
+class StringLiteral : public UnaryExpression
+{
+private:
+ std::string string_content_;
+public:
+ StringLiteral(const std::string &string_content);
+
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual TypePtr getType(const Bindings &bindings) const;
};
class Constant : public UnaryExpression
@@ -293,9 +307,9 @@ private:
public:
Constant(const int32_t &constant);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual int constantFold() const;
- virtual TypePtr getType(const VariableStackBindings &bindings) const;
+ virtual TypePtr getType(const Bindings &bindings) const;
};
#endif
diff --git a/c_compiler/include/function.hpp b/c_compiler/include/function.hpp
index f9f4fa0..2227f52 100644
--- a/c_compiler/include/function.hpp
+++ b/c_compiler/include/function.hpp
@@ -27,9 +27,9 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int& label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int& label_count) const;
- void printParameterAsm(VariableStackBindings& bindings, int& frame_offset) const;
+ void printParameterAsm(Bindings& bindings, int& frame_offset) const;
void countParameters(int& parameter_count) const;
};
diff --git a/c_compiler/include/node.hpp b/c_compiler/include/node.hpp
index 0149807..1612aaf 100644
--- a/c_compiler/include/node.hpp
+++ b/c_compiler/include/node.hpp
@@ -6,7 +6,7 @@
#include <string>
class Type;
-class VariableStackBindings;
+class Bindings;
// base node class
@@ -17,7 +17,7 @@ public:
virtual void print() const = 0;
virtual void printXml() const = 0;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int& label_count) const = 0;
+ virtual Bindings printAsm(Bindings bindings, int& label_count) const = 0;
};
diff --git a/c_compiler/include/statement.hpp b/c_compiler/include/statement.hpp
index ce469ac..94c1a36 100644
--- a/c_compiler/include/statement.hpp
+++ b/c_compiler/include/statement.hpp
@@ -23,7 +23,7 @@ public:
virtual void print() const = 0;
virtual void printXml() const = 0;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const = 0;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0;
virtual void countVariables(int &var_count) const = 0;
virtual void countArguments(int &argument_count) const = 0;
@@ -48,7 +48,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual void countVariables(int &var_count) const;
virtual void countArguments(int &argument_count) const;
@@ -67,7 +67,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual void countVariables(int &var_count) const;
virtual void countArguments(int &argument_count) const;
@@ -89,7 +89,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual void countVariables(int &var_count) const;
virtual void countArguments(int &argument_count) const;
@@ -109,7 +109,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual void countVariables(int &var_count) const;
virtual void countArguments(int &argument_count) const;
@@ -125,7 +125,7 @@ public:
SwitchStatement(Expression *condition, Statement *statement);
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual void countVariables(int &var_count) const;
virtual void countArguments(int &argument_count) const;
@@ -141,7 +141,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual void countVariables(int &var_count) const;
virtual void countArguments(int &argument_count) const;
@@ -151,7 +151,7 @@ public:
class JumpStatement : public Statement
{
public:
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const = 0;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0;
virtual void print() const;
virtual void printXml() const;
@@ -168,7 +168,7 @@ private:
public:
ReturnStatement(Expression *expression = nullptr);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual void countVariables(int &var_count) const;
virtual void countArguments(int &argument_count) const;
@@ -180,7 +180,7 @@ class BreakStatement : public JumpStatement
public:
BreakStatement();
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &) const;
+ virtual Bindings printAsm(Bindings bindings, int &) const;
};
class ContinueStatement : public JumpStatement
@@ -188,7 +188,7 @@ class ContinueStatement : public JumpStatement
public:
ContinueStatement();
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &) const;
+ virtual Bindings printAsm(Bindings bindings, int &) const;
};
class GotoStatement : public JumpStatement
@@ -198,7 +198,7 @@ private:
public:
GotoStatement(const std::string &label);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &) const;
+ virtual Bindings printAsm(Bindings bindings, int &) const;
};
class IterationStatement : public Statement
@@ -211,7 +211,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const = 0;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0;
virtual void countVariables(int &var_count) const;
virtual void countArguments(int &argument_count) const;
@@ -225,7 +225,7 @@ private:
public:
WhileLoop(Expression *condition, Statement *statement, const bool &is_while = true);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
};
class ForLoop : public IterationStatement
@@ -236,7 +236,7 @@ private:
public:
ForLoop(Expression *initializer, Expression *condition, Expression *incrementer, Statement *statement);
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
};
diff --git a/c_compiler/include/translation_unit.hpp b/c_compiler/include/translation_unit.hpp
index 2003073..04a9d16 100644
--- a/c_compiler/include/translation_unit.hpp
+++ b/c_compiler/include/translation_unit.hpp
@@ -19,7 +19,7 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int& label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int& label_count) const;
void push(Node* external_declaration);
};
diff --git a/c_compiler/include/type.hpp b/c_compiler/include/type.hpp
index 04bd7a8..7da2100 100644
--- a/c_compiler/include/type.hpp
+++ b/c_compiler/include/type.hpp
@@ -15,13 +15,13 @@ class Type : public Node
public:
virtual void print() const = 0;
virtual void printXml() const = 0;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const = 0;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0;
virtual TypePtr type() = 0;
virtual TypePtr type(Type *type_ptr) = 0;
virtual TypePtr type(TypePtr type_ptr) = 0;
- virtual void increaseStackPosition(VariableStackBindings &bindings) const = 0;
+ virtual void increaseStackPosition(Bindings &bindings) const = 0;
virtual void load() const = 0;
virtual void load(const int &reg, const int &position) const = 0;
virtual void store() const = 0;
@@ -46,13 +46,13 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual TypePtr type();
virtual TypePtr type(Type *type_ptr);
virtual TypePtr type(TypePtr type_ptr);
- virtual void increaseStackPosition(VariableStackBindings &bindings) const;
+ virtual void increaseStackPosition(Bindings &bindings) const;
virtual void load() const;
virtual void load(const int &reg, const int &position) const;
virtual void store() const;
@@ -70,13 +70,13 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual TypePtr type();
virtual TypePtr type(Type *type_ptr);
virtual TypePtr type(TypePtr type_ptr);
- virtual void increaseStackPosition(VariableStackBindings &bindings) const;
+ virtual void increaseStackPosition(Bindings &bindings) const;
virtual void load() const;
virtual void load(const int &reg, const int &position) const;
virtual void store() const;
@@ -106,13 +106,13 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
virtual TypePtr type();
virtual TypePtr type(Type *type_ptr);
virtual TypePtr type(TypePtr type_ptr);
- virtual void increaseStackPosition(VariableStackBindings &bindings) const;
+ virtual void increaseStackPosition(Bindings &bindings) const;
virtual void load() const;
virtual void load(const int &reg, const int &position) const;
virtual void store() const;
@@ -132,9 +132,9 @@ class Specifier : public Type
public:
virtual void print() const = 0;
virtual void printXml() const = 0;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const = 0;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0;
- virtual void increaseStackPosition(VariableStackBindings &bindings) const = 0;
+ virtual void increaseStackPosition(Bindings &bindings) const = 0;
virtual void load() const = 0;
virtual void load(const int &reg, const int &position) const = 0;
virtual void store() const = 0;
@@ -154,8 +154,8 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
- virtual void increaseStackPosition(VariableStackBindings &bindings) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual void increaseStackPosition(Bindings &bindings) const;
virtual void load() const;
virtual void load(const int &reg, const int &position) const;
virtual void store() const;
@@ -171,8 +171,8 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
- virtual void increaseStackPosition(VariableStackBindings &bindings) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual void increaseStackPosition(Bindings &bindings) const;
virtual void load() const;
virtual void load(const int &reg, const int &position) const;
virtual void store() const;
@@ -188,8 +188,8 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
- virtual void increaseStackPosition(VariableStackBindings &bindings) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual void increaseStackPosition(Bindings &bindings) const;
virtual void load() const;
virtual void load(const int &reg, const int &position) const;
virtual void store() const;
@@ -205,8 +205,8 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
- virtual void increaseStackPosition(VariableStackBindings &bindings) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual void increaseStackPosition(Bindings &bindings) const;
virtual void load() const;
virtual void load(const int &reg, const int &position) const;
virtual void store() const;
@@ -222,8 +222,8 @@ public:
virtual void print() const;
virtual void printXml() const;
- virtual VariableStackBindings printAsm(VariableStackBindings bindings, int &label_count) const;
- virtual void increaseStackPosition(VariableStackBindings &bindings) const;
+ virtual Bindings printAsm(Bindings bindings, int &label_count) const;
+ virtual void increaseStackPosition(Bindings &bindings) const;
virtual void load() const;
virtual void load(const int &reg, const int &position) const;
virtual void store() const;
diff --git a/c_compiler/src/bindings.cpp b/c_compiler/src/bindings.cpp
index 24e1745..e91d408 100644
--- a/c_compiler/src/bindings.cpp
+++ b/c_compiler/src/bindings.cpp
@@ -1,13 +1,14 @@
#include "bindings.hpp"
+std::vector<std::string> Bindings::string_literals;
-// VariableStackBindings definition
+// Bindings definition
-VariableStackBindings::VariableStackBindings()
+Bindings::Bindings()
: break_label_(""), continue_label_(""), stack_counter_(0), expression_stack_(16)
{}
-void VariableStackBindings::insertBinding(const std::string &id, TypePtr type, const int &stack_position)
+void Bindings::insertBinding(const std::string &id, TypePtr type, const int &stack_position)
{
auto binding = bindings_.find(id);
@@ -16,7 +17,7 @@ void VariableStackBindings::insertBinding(const std::string &id, TypePtr type, c
DeclarationData decl_data;
decl_data.type = type;
decl_data.stack_position = stack_position;
- bindings_.insert(std::pair<std::string, DeclarationData>(id, decl_data));
+ bindings_.insert(std::make_pair(id, decl_data));
}
else
{
@@ -25,65 +26,71 @@ void VariableStackBindings::insertBinding(const std::string &id, TypePtr type, c
}
}
-void VariableStackBindings::increaseStackPosition()
+int Bindings::insertStringLiteral(const std::string &string_literal)
+{
+ string_literals.push_back(string_literal);
+ return (int)string_literals.size()-1;
+}
+
+void Bindings::increaseStackPosition()
{
stack_counter_ += 4;
}
-void VariableStackBindings::increaseStackPosition(const int &position)
+void Bindings::increaseStackPosition(const int &position)
{
stack_counter_ += position;
}
-void VariableStackBindings::setStackPosition(const int &stack_counter)
+void Bindings::setStackPosition(const int &stack_counter)
{
stack_counter_ = stack_counter;
}
-void VariableStackBindings::nextExpressionStackPosition()
+void Bindings::nextExpressionStackPosition()
{
expression_stack_ += 4;
}
-void VariableStackBindings::setExpressionStackPosition(const int &stack_counter)
+void Bindings::setExpressionStackPosition(const int &stack_counter)
{
expression_stack_ = stack_counter;
}
-TypePtr VariableStackBindings::getType(const std::string &id) const
+TypePtr Bindings::getType(const std::string &id) const
{
auto binding = bindings_.find(id);
return (*binding).second.type;
}
-std::string VariableStackBindings::breakLabel()
+std::string Bindings::breakLabel()
{
return break_label_;
}
-std::string VariableStackBindings::breakLabel(const std::string &label)
+std::string Bindings::breakLabel(const std::string &label)
{
break_label_ = label;
return break_label_;
}
-std::string VariableStackBindings::continueLabel()
+std::string Bindings::continueLabel()
{
return continue_label_;
}
-std::string VariableStackBindings::continueLabel(const std::string &label)
+std::string Bindings::continueLabel(const std::string &label)
{
continue_label_ = label;
return continue_label_;
}
-int VariableStackBindings::currentStackPosition() const
+int Bindings::currentStackPosition() const
{
return stack_counter_;
}
-int VariableStackBindings::stackPosition(const std::string &id) const
+int Bindings::stackPosition(const std::string &id) const
{
auto binding = bindings_.find(id);
@@ -93,12 +100,18 @@ int VariableStackBindings::stackPosition(const std::string &id) const
else return 0;
}
-int VariableStackBindings::currentExpressionStackPosition() const
+int Bindings::currentExpressionStackPosition() const
{
return expression_stack_;
}
-bool VariableStackBindings::bindingExists(const std::string &id) const
+std::pair<std::vector<std::string>::const_iterator, std::vector<std::string>::const_iterator>
+Bindings::getStringLiteralIterator() const
+{
+ return std::make_pair(string_literals.begin(), string_literals.end());
+}
+
+bool Bindings::bindingExists(const std::string &id) const
{
auto binding = bindings_.find(id);
diff --git a/c_compiler/src/c_lexer.flex b/c_compiler/src/c_lexer.flex
index 8dcef35..8365a5b 100644
--- a/c_compiler/src/c_lexer.flex
+++ b/c_compiler/src/c_lexer.flex
@@ -16,9 +16,9 @@ DECIMALCONSTANT ([1-9][0-9]*)
OCTALCONSTANT ([0][0-7]*)
HEXCONSTANT ([0][xX][0-9A-Fa-f]+)
-CHARCONSTANT ('(([\\]['])|([^']))+')
+CHARCONSTANT (['](([\\]['])|([^']))*['])
-STRINGLITERAL ["](([\\]["])|([^"]))*["]
+STRINGLITERAL (["](([\\]["])|([^"]))*["])
WHITESPACE [ \t\r\n]+
@@ -54,6 +54,15 @@ ALL .
(default) { return T_DEFAULT; }
(switch) { return T_SWITCH; }
+{STRINGLITERAL} { std::string tmp(yytext); yylval.string = new std::string(tmp.substr(1, yyleng-2));
+ return T_STRINGLITERAL; }
+L{STRINGLITERAL} { std::string tmp(yytext); yylval.string = new std::string(tmp.substr(2, yyleng-3));
+ return T_STRINGLITERAL;}
+
+{CHARCONSTANT} { yylval.number = yytext[1]; return T_INT_CONST; }
+L{CHARCONSTANT} { yylval.number = yytext[2]; return T_INT_CONST; }
+
+
[.][.][.] { return T_ELLIPSIS; }
[;] { return T_SC; }
[,] { return T_CMA; }
diff --git a/c_compiler/src/c_parser.y b/c_compiler/src/c_parser.y
index 2c5d215..81293ba 100644
--- a/c_compiler/src/c_parser.y
+++ b/c_compiler/src/c_parser.y
@@ -41,7 +41,7 @@ void yyerror(const char *);
T_VOID T_CHAR T_SHORT T_INT T_LONG T_FLOAT T_DOUBLE T_SIGNED T_UNSIGNED
T_TYPEDEF T_EXTERN T_STATIC T_AUTO T_REGISTER
T_CONST T_VOLATILE T_GOTO T_BREAK T_CONTINUE
- T_CASE T_DEFAULT T_SWITCH T_ELLIPSIS
+ T_CASE T_DEFAULT T_SWITCH T_ELLIPSIS T_STRINGLITERAL
%nonassoc T_RRB
%nonassoc T_ELSE
@@ -74,8 +74,9 @@ void yyerror(const char *);
%type <number> T_INT_CONST
%type <string> T_IDENTIFIER ASSIGN_OPER T_ASSIGN_OPER T_EQ T_AND T_ADDSUB_OP T_TILDE T_NOT
- T_MULT T_DIV T_REM T_EQUALITY_OP T_REL_OP T_SHIFT_OP T_INCDEC MultDivRemOP
- UnaryOperator DeclarationSpecifier TypeQualifier TypeQualifierList
+ T_MULT T_DIV T_REM T_EQUALITY_OP T_REL_OP T_SHIFT_OP T_INCDEC T_STRINGLITERAL
+ MultDivRemOP UnaryOperator DeclarationSpecifier TypeQualifier
+ TypeQualifierList
%start ROOT
@@ -467,6 +468,7 @@ ArgumentExpressionList:
PrimaryExpression:
T_IDENTIFIER { $$ = new Identifier(*$1); delete $1; }
| Constant { $$ = $1; }
+ | T_STRINGLITERAL { $$ = new StringLiteral(*$1); delete $1; }
| T_LRB Expression T_RRB { $$ = $2; }
;
diff --git a/c_compiler/src/compiler_main.cpp b/c_compiler/src/compiler_main.cpp
index dc2fc17..4ed3bff 100644
--- a/c_compiler/src/compiler_main.cpp
+++ b/c_compiler/src/compiler_main.cpp
@@ -11,7 +11,7 @@ int main(int, char**)
try
{
std::unique_ptr<Node> ast(parseAST());
- VariableStackBindings bindings;
+ Bindings bindings;
int label_count = 0;
ast->printAsm(bindings, label_count);
}
diff --git a/c_compiler/src/declaration.cpp b/c_compiler/src/declaration.cpp
index a3ee5d3..594c91b 100644
--- a/c_compiler/src/declaration.cpp
+++ b/c_compiler/src/declaration.cpp
@@ -38,7 +38,7 @@ void Declaration::printXml() const
printf("<Variable id=\"%s\" />", id_.c_str());
}
-VariableStackBindings Declaration::printAsm(VariableStackBindings bindings, int& label_count) const
+Bindings Declaration::printAsm(Bindings bindings, int& label_count) const
{
(void)label_count;
if(!extern_declaration_)
@@ -54,7 +54,7 @@ VariableStackBindings Declaration::printAsm(VariableStackBindings bindings, int&
return bindings;
}
-VariableStackBindings Declaration::localAsm(VariableStackBindings bindings, int& label_count) const
+Bindings Declaration::localAsm(Bindings bindings, int& label_count) const
{
if(next_declaration_ != nullptr)
bindings = next_declaration_->localAsm(bindings, label_count);
@@ -148,12 +148,12 @@ ArrayDeclaration::ArrayDeclaration(const std::string &id, ExpressionPtr initiali
: Declaration(id, initializer), size_(size)
{}
-VariableStackBindings ArrayDeclaration::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ArrayDeclaration::printAsm(Bindings bindings, int &label_count) const
{
return bindings;
}
-VariableStackBindings ArrayDeclaration::localAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ArrayDeclaration::localAsm(Bindings bindings, int &label_count) const
{
if(next_declaration_ != nullptr)
bindings = next_declaration_->localAsm(bindings, label_count);
diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp
index 466d8f7..8d2e7cf 100644
--- a/c_compiler/src/expression.cpp
+++ b/c_compiler/src/expression.cpp
@@ -39,7 +39,7 @@ std::string Expression::id() const
return "";
}
-TypePtr Expression::getType(const VariableStackBindings &) const
+TypePtr Expression::getType(const Bindings &) const
{
// by default return largest size, which is 32 bits
return std::make_shared<Int>();
@@ -86,7 +86,7 @@ void OperationExpression::expressionDepth(int &depth_count) const
depth_count = rhs_depth_count;
}
-TypePtr OperationExpression::getType(const VariableStackBindings &bindings) const
+TypePtr OperationExpression::getType(const Bindings &bindings) const
{
return lhs_->getType(bindings);
}
@@ -101,7 +101,7 @@ ExpressionPtr OperationExpression::getRhs() const
return rhs_;
}
-void OperationExpression::evaluateExpression(VariableStackBindings bindings, int &label_count) const
+void OperationExpression::evaluateExpression(Bindings bindings, int &label_count) const
{
// I can just evaluate the lhs with the same entry stack position
lhs_->printAsm(bindings, label_count);
@@ -115,14 +115,24 @@ void OperationExpression::evaluateExpression(VariableStackBindings bindings, int
// now I have them evaluated at two positions in the stack and can load both into registers
// $2 and $3
- lhs_->getType(bindings)->load(2, lhs_stack_position);
+ printf("\tlw\t$2,%d($fp)\n", lhs_stack_position);
printf("\tlw\t$3,%d($fp)\n", bindings.currentExpressionStackPosition());
}
// Unary expression definition
-void UnaryExpression::stackPosition(VariableStackBindings, int &) const
+void UnaryExpression::expressionDepth(int &depth_count) const
+{
+ ++depth_count;
+}
+
+void UnaryExpression::pointerPosition(Bindings bindings) const
+{
+ throw std::runtime_error("Error : Cannot get pointer position");
+}
+
+void UnaryExpression::stackPosition(Bindings, int &) const
{
throw std::runtime_error("Error : Cannot get stack position of expression");
}
@@ -134,7 +144,7 @@ PostfixArrayElement::PostfixArrayElement(Expression *postfix_expression, Express
: postfix_expression_(postfix_expression), index_expression_(index_expression)
{}
-VariableStackBindings PostfixArrayElement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings PostfixArrayElement::printAsm(Bindings bindings, int &label_count) const
{
stackPosition(bindings, label_count);
TypePtr type_ptr = postfix_expression_->getType(bindings);
@@ -148,7 +158,7 @@ VariableStackBindings PostfixArrayElement::printAsm(VariableStackBindings bindin
return bindings;
}
-void PostfixArrayElement::stackPosition(VariableStackBindings bindings, int &label_count) const
+void PostfixArrayElement::stackPosition(Bindings bindings, int &label_count) const
{
index_expression_->printAsm(bindings, label_count);
@@ -169,7 +179,7 @@ void PostfixArrayElement::expressionDepth(int &depth_count) const
index_expression_->expressionDepth(depth_count);
}
-TypePtr PostfixArrayElement::getType(const VariableStackBindings &bindings) const
+TypePtr PostfixArrayElement::getType(const Bindings &bindings) const
{
return postfix_expression_->getType(bindings);
}
@@ -181,7 +191,7 @@ PostfixFunctionCall::PostfixFunctionCall(Expression *argument_expression_list)
: argument_expression_list_(argument_expression_list)
{}
-VariableStackBindings PostfixFunctionCall::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings PostfixFunctionCall::printAsm(Bindings bindings, int &label_count) const
{
std::vector<ExpressionPtr> argument_vector;
ExpressionPtr current_argument = argument_expression_list_;
@@ -235,7 +245,7 @@ void PostfixFunctionCall::expressionDepth(int &depth_count) const
argument_expression_list_->expressionDepth(depth_count);
}
-TypePtr PostfixFunctionCall::getType(const VariableStackBindings &) const
+TypePtr PostfixFunctionCall::getType(const Bindings &) const
{
return std::make_shared<Int>();
}
@@ -247,7 +257,7 @@ PostfixPostIncDecExpression::PostfixPostIncDecExpression(const std::string &_ope
: operator_(_operator), postfix_expression_(postfix_expression)
{}
-VariableStackBindings PostfixPostIncDecExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings PostfixPostIncDecExpression::printAsm(Bindings bindings, int &label_count) const
{
postfix_expression_->printAsm(bindings, label_count);
if(operator_ == "++")
@@ -279,7 +289,7 @@ VariableStackBindings PostfixPostIncDecExpression::printAsm(VariableStackBinding
return bindings;
}
-TypePtr PostfixPostIncDecExpression::getType(const VariableStackBindings &bindings) const
+TypePtr PostfixPostIncDecExpression::getType(const Bindings &bindings) const
{
return postfix_expression_->getType(bindings);
}
@@ -291,7 +301,7 @@ UnaryPreIncDecExpression::UnaryPreIncDecExpression(const std::string &_operator,
: operator_(_operator), unary_expression_(unary_expression)
{}
-VariableStackBindings UnaryPreIncDecExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings UnaryPreIncDecExpression::printAsm(Bindings bindings, int &label_count) const
{
unary_expression_->printAsm(bindings, label_count);
if(operator_ == "++")
@@ -310,7 +320,7 @@ VariableStackBindings UnaryPreIncDecExpression::printAsm(VariableStackBindings b
return bindings;
}
-TypePtr UnaryPreIncDecExpression::getType(const VariableStackBindings &bindings) const
+TypePtr UnaryPreIncDecExpression::getType(const Bindings &bindings) const
{
return unary_expression_->getType(bindings);
}
@@ -322,7 +332,7 @@ OperatorUnaryExpression::OperatorUnaryExpression(const std::string &_operator, E
: operator_(_operator), cast_expression_(cast_expression)
{}
-VariableStackBindings OperatorUnaryExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings OperatorUnaryExpression::printAsm(Bindings bindings, int &label_count) const
{
cast_expression_->printAsm(bindings, label_count);
if(operator_ == "!")
@@ -354,7 +364,7 @@ VariableStackBindings OperatorUnaryExpression::printAsm(VariableStackBindings bi
return bindings;
}
-void OperatorUnaryExpression::stackPosition(VariableStackBindings bindings, int &label_count) const
+void OperatorUnaryExpression::stackPosition(Bindings bindings, int &label_count) const
{
if(operator_ == "*")
{
@@ -364,7 +374,7 @@ void OperatorUnaryExpression::stackPosition(VariableStackBindings bindings, int
}
}
-TypePtr OperatorUnaryExpression::getType(const VariableStackBindings &bindings) const
+TypePtr OperatorUnaryExpression::getType(const Bindings &bindings) const
{
return cast_expression_->getType(bindings);
}
@@ -376,7 +386,7 @@ CastExpression::CastExpression(Type *type, Expression *expression)
: type_(type), expression_(expression)
{}
-VariableStackBindings CastExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings CastExpression::printAsm(Bindings bindings, int &label_count) const
{
return bindings;
}
@@ -389,7 +399,7 @@ void CastExpression::expressionDepth(int &depth_count) const
expression_->expressionDepth(depth_count);
}
-TypePtr CastExpression::getType(const VariableStackBindings &) const
+TypePtr CastExpression::getType(const Bindings &) const
{
return type_;
}
@@ -401,7 +411,7 @@ AdditiveExpression::AdditiveExpression(Expression *lhs, const std::string &_oper
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings AdditiveExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings AdditiveExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
@@ -435,7 +445,7 @@ MultiplicativeExpression::MultiplicativeExpression(Expression *lhs, const std::s
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings MultiplicativeExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings MultiplicativeExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
@@ -480,7 +490,7 @@ ShiftExpression::ShiftExpression(Expression* lhs, const std::string &_operator,
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings ShiftExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ShiftExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
@@ -516,7 +526,7 @@ RelationalExpression::RelationalExpression(Expression* lhs, const std::string &_
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings RelationalExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings RelationalExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
@@ -571,7 +581,7 @@ EqualityExpression::EqualityExpression(Expression *lhs, const std::string &_oper
: OperationExpression(lhs, rhs), operator_(_operator)
{}
-VariableStackBindings EqualityExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings EqualityExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
printf("\txor\t$2,$2,$3\n");
@@ -608,7 +618,7 @@ AndExpression::AndExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings AndExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings AndExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
printf("\tand\t$2,$2,$3\n\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
@@ -627,7 +637,7 @@ ExclusiveOrExpression::ExclusiveOrExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings ExclusiveOrExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ExclusiveOrExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
printf("\txor\t$2,$2,$3\n\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
@@ -646,7 +656,7 @@ InclusiveOrExpression::InclusiveOrExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings InclusiveOrExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings InclusiveOrExpression::printAsm(Bindings bindings, int &label_count) const
{
evaluateExpression(bindings, label_count);
printf("\tor\t$2,$2,$3\n\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
@@ -665,7 +675,7 @@ LogicalAndExpression::LogicalAndExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings LogicalAndExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings LogicalAndExpression::printAsm(Bindings bindings, int &label_count) const
{
int log_and = label_count++;
lhs_->printAsm(bindings, label_count);
@@ -690,7 +700,7 @@ LogicalOrExpression::LogicalOrExpression(Expression *lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings LogicalOrExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings LogicalOrExpression::printAsm(Bindings bindings, int &label_count) const
{
int log_or = label_count++;
lhs_->printAsm(bindings, label_count);
@@ -718,12 +728,12 @@ ConditionalExpression::ConditionalExpression(Expression *logical_or,
conditional_expression_(conditional_expression)
{}
-VariableStackBindings ConditionalExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ConditionalExpression::printAsm(Bindings bindings, int &label_count) const
{
return bindings;
}
-TypePtr ConditionalExpression::getType(const VariableStackBindings &bindings) const
+TypePtr ConditionalExpression::getType(const Bindings &bindings) const
{
return std::make_shared<Int>();
}
@@ -739,7 +749,7 @@ AssignmentExpression::AssignmentExpression(ExpressionPtr lhs, Expression *rhs)
: OperationExpression(lhs, rhs)
{}
-VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings AssignmentExpression::printAsm(Bindings bindings, int &label_count) const
{
// TODO add stack and store results in there, also for addition and multiplication.
@@ -754,17 +764,28 @@ VariableStackBindings AssignmentExpression::printAsm(VariableStackBindings bindi
// don't have to change the stack position as there is no lhs to evaluate
rhs_->printAsm(bindings, label_count);
bindings.nextExpressionStackPosition();
-
+
+ std::shared_ptr<StringLiteral> rhs_tmp;
+ rhs_tmp = std::dynamic_pointer_cast<StringLiteral>(rhs_);
+
// we are assigning so we don't have to evaluate the lhs as it will be overwritten anyways
- lhs_postfix->stackPosition(bindings, label_count);
+ if(rhs_tmp != nullptr)
+ {
+ lhs_postfix->pointerPosition(bindings);
+ }
+ else
+ {
+ lhs_postfix->stackPosition(bindings, label_count);
+ }
// now the result of the rhs will be in that stack position, so we can load it into $2
+ printf("\tlw\t$2,%d($fp)\n", expression_stack_position);
+
TypePtr lhs_type = lhs_->getType(bindings);
- lhs_type->load(2, expression_stack_position);
-
// check if lhs is trying to access an array
std::shared_ptr<PostfixArrayElement> lhs_tmp;
lhs_tmp = std::dynamic_pointer_cast<PostfixArrayElement>(lhs_);
+
if(lhs_tmp != nullptr)
{
std::shared_ptr<Pointer> lhs_pointer_type;
@@ -793,7 +814,7 @@ Identifier::Identifier(const std::string &id)
: id_(id)
{}
-VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, int &) const
+Bindings Identifier::printAsm(Bindings bindings, int &) const
{
if(bindings.bindingExists(id_))
{
@@ -824,12 +845,23 @@ VariableStackBindings Identifier::printAsm(VariableStackBindings bindings, int &
return bindings;
}
-void Identifier::stackPosition(VariableStackBindings bindings, int &) const
+void Identifier::pointerPosition(Bindings bindings) const
+{
+ if(bindings.bindingExists(id_))
+ {
+ printf("\taddiu\t$t0,$fp,%d\n", bindings.stackPosition(id_));
+ return;
+ }
+
+ throw std::runtime_error("Error : '"+id_+"' not yet declared");
+}
+
+void Identifier::stackPosition(Bindings bindings, int &) const
{
if(bindings.bindingExists(id_))
{
if(std::dynamic_pointer_cast<Pointer>(bindings.getType(id_)) != nullptr)
- printf("\tlw\t$3,%d($fp)\n\tmove\t$t0,$3\n", bindings.stackPosition(id_));
+ printf("\tlw\t$t0,%d($fp)\n", bindings.stackPosition(id_));
else
printf("\taddiu\t$t0,$fp,%d\n", bindings.stackPosition(id_));
return;
@@ -843,19 +875,41 @@ std::string Identifier::id() const
return id_;
}
-TypePtr Identifier::getType(const VariableStackBindings &bindings) const
+TypePtr Identifier::getType(const Bindings &bindings) const
{
return bindings.getType(id_);
}
+// String literal definition
+
+StringLiteral::StringLiteral(const std::string &string_content)
+ : string_content_(string_content)
+{}
+
+Bindings StringLiteral::printAsm(Bindings bindings, int &) const
+{
+ int label = bindings.insertStringLiteral(string_content_);
+ printf("\tlui\t$2,%%hi($%d_string)\n\taddiu\t$2,$2,%%lo($%d_string)\n", label, label);
+ printf("\tsw\t$2,%d($fp)\n", bindings.currentExpressionStackPosition());
+ return bindings;
+}
+
+TypePtr StringLiteral::getType(const Bindings &) const
+{
+ std::shared_ptr<Pointer> tmp_pointer_ptr;
+ tmp_pointer_ptr->type(std::make_shared<Char>());
+ return tmp_pointer_ptr;
+}
+
+
// Constant definition
Constant::Constant(const int32_t &constant)
: constant_(constant)
{}
-VariableStackBindings Constant::printAsm(VariableStackBindings bindings, int &) const
+Bindings Constant::printAsm(Bindings bindings, int &) const
{
// constant only has to load to $2 because the other expression will take care of the rest
printf("\tli\t$2,%d\n", constant_);
@@ -868,7 +922,7 @@ int Constant::constantFold() const
return constant_;
}
-TypePtr Constant::getType(const VariableStackBindings &) const
+TypePtr Constant::getType(const Bindings &) const
{
return std::make_shared<Int>();
}
diff --git a/c_compiler/src/function.cpp b/c_compiler/src/function.cpp
index 8ce3be0..5cdb33d 100644
--- a/c_compiler/src/function.cpp
+++ b/c_compiler/src/function.cpp
@@ -47,9 +47,9 @@ void Function::printXml() const
printf("</Function>\n");
}
-VariableStackBindings Function::printAsm(VariableStackBindings bindings, int& label_count) const
+Bindings Function::printAsm(Bindings bindings, int& label_count) const
{
- VariableStackBindings original_bindings = bindings;
+ Bindings original_bindings = bindings;
// Counting all the variables being declared in the function
int variable_count = 0;
if(statement_ != nullptr)
@@ -71,11 +71,7 @@ VariableStackBindings Function::printAsm(VariableStackBindings bindings, int& la
// This adds 2 to store the frame pointer and the return address
int memory_needed = 4*(variable_count+max_argument_count+max_depth+2);
- // make frame double word aligned
- if(memory_needed % 8 != 0)
- memory_needed += 4;
-
- printf("\t.text\n\t.globl\t%s\n%s:\n\taddiu\t$sp,$sp,-%d\n\tsw\t",
+ printf("\t.text\n\t.align\t2\n\t.globl\t%s\n%s:\n\taddiu\t$sp,$sp,-%d\n\tsw\t",
id_.c_str(), id_.c_str(), memory_needed);
printf("$31,%d($sp)\n\tsw\t$fp,%d($sp)\n\tmove\t$fp,$sp\n", memory_needed-4, memory_needed-8);
@@ -91,10 +87,20 @@ VariableStackBindings Function::printAsm(VariableStackBindings bindings, int& la
printf("\tmove\t$2,$0\n0:\n\tmove\t$sp,$fp\n\tlw\t$31,%d($sp)\n\tlw\t$fp,%d", memory_needed-4, memory_needed-8);
printf("($sp)\n\taddiu\t$sp,$sp,%d\n\tjr\t$31\n\tnop\n", memory_needed);
+ auto string_lit_iterator = bindings.getStringLiteralIterator();
+ if(string_lit_iterator.first != string_lit_iterator.second)
+ {
+ printf("\n\t.rdata\n\t.align\t2\n");
+ for(auto itr = string_lit_iterator.first; itr != string_lit_iterator.second; ++itr)
+ {
+ printf("$%d_string:\n\t.ascii\t\"%s\\000\"", int(itr-string_lit_iterator.first), (*itr).c_str());
+ }
+ }
+
return original_bindings;
}
-void Function::printParameterAsm(VariableStackBindings& bindings, int& frame_offset) const
+void Function::printParameterAsm(Bindings& bindings, int& frame_offset) const
{
std::vector<DeclarationPtr> parameter_vector;
DeclarationPtr parameter_list = parameter_list_;
diff --git a/c_compiler/src/statement.cpp b/c_compiler/src/statement.cpp
index 0b871e8..309e2d8 100644
--- a/c_compiler/src/statement.cpp
+++ b/c_compiler/src/statement.cpp
@@ -58,7 +58,7 @@ void LabelStatement::printXml() const
next_statement_->printXml();
}
-VariableStackBindings LabelStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings LabelStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -123,7 +123,7 @@ void CaseStatement::printXml() const
next_statement_->printXml();
}
-VariableStackBindings CaseStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings CaseStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -216,9 +216,9 @@ void CompoundStatement::printXml() const
printf("</Scope>\n");
}
-VariableStackBindings CompoundStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings CompoundStatement::printAsm(Bindings bindings, int &label_count) const
{
- VariableStackBindings outer_scope_bindings = bindings;
+ Bindings outer_scope_bindings = bindings;
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -303,7 +303,7 @@ void IfElseStatement::printXml() const
else_->printXml();
}
-VariableStackBindings IfElseStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings IfElseStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -406,7 +406,7 @@ void SwitchStatement::printXml() const
statement_->printXml();
}
-VariableStackBindings SwitchStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings SwitchStatement::printAsm(Bindings bindings, int &label_count) const
{
int switch_count = label_count++;
std::shared_ptr<CompoundStatement> comp_statement;
@@ -533,7 +533,7 @@ void ExpressionStatement::printXml() const
next_statement_->printXml();
}
-VariableStackBindings ExpressionStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ExpressionStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -622,7 +622,7 @@ ReturnStatement::ReturnStatement(Expression *expression)
: expression_(expression)
{}
-VariableStackBindings ReturnStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ReturnStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -682,7 +682,7 @@ void ReturnStatement::countExpressionDepth(int &depth_count) const
BreakStatement::BreakStatement()
{}
-VariableStackBindings BreakStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings BreakStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -697,7 +697,7 @@ VariableStackBindings BreakStatement::printAsm(VariableStackBindings bindings, i
ContinueStatement::ContinueStatement()
{}
-VariableStackBindings ContinueStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ContinueStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -713,7 +713,7 @@ GotoStatement::GotoStatement(const std::string &label)
: label_(label)
{}
-VariableStackBindings GotoStatement::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings GotoStatement::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
@@ -789,12 +789,12 @@ WhileLoop::WhileLoop(Expression *condition, Statement *statement, const bool &is
: IterationStatement(condition, statement), is_while_(is_while)
{}
-VariableStackBindings WhileLoop::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings WhileLoop::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
- VariableStackBindings initial_bindings = bindings;
+ Bindings initial_bindings = bindings;
int while_label = label_count++;
@@ -816,12 +816,12 @@ ForLoop::ForLoop(Expression *initializer, Expression *condition, Expression *inc
: IterationStatement(condition, statement), initializer_(initializer), incrementer_(incrementer)
{}
-VariableStackBindings ForLoop::printAsm(VariableStackBindings bindings, int &label_count) const
+Bindings ForLoop::printAsm(Bindings bindings, int &label_count) const
{
if(next_statement_ != nullptr)
next_statement_->printAsm(bindings, label_count);
- VariableStackBindings initial_bindings = bindings;
+ Bindings initial_bindings = bindings;
int for_label = label_count++;
diff --git a/c_compiler/src/translation_unit.cpp b/c_compiler/src/translation_unit.cpp
index 41d1171..3dd8a7b 100644
--- a/c_compiler/src/translation_unit.cpp
+++ b/c_compiler/src/translation_unit.cpp
@@ -25,7 +25,7 @@ void TranslationUnit::printXml() const
printf("</Program>\n");
}
-VariableStackBindings TranslationUnit::printAsm(VariableStackBindings bindings, int& label_count) const
+Bindings TranslationUnit::printAsm(Bindings bindings, int& label_count) const
{
for(auto& node : translation_unit_) {
bindings = node->printAsm(bindings, label_count);
diff --git a/c_compiler/src/type.cpp b/c_compiler/src/type.cpp
index 251ebc5..675230c 100644
--- a/c_compiler/src/type.cpp
+++ b/c_compiler/src/type.cpp
@@ -46,7 +46,7 @@ void Array::print() const
void Array::printXml() const
{}
-VariableStackBindings Array::printAsm(VariableStackBindings bindings, int &) const
+Bindings Array::printAsm(Bindings bindings, int &) const
{
return bindings;
}
@@ -69,7 +69,7 @@ TypePtr Array::type(TypePtr type_ptr)
return type_;
}
-void Array::increaseStackPosition(VariableStackBindings &bindings) const
+void Array::increaseStackPosition(Bindings &bindings) const
{
for(int i = 0; i < size_; ++i)
{
@@ -121,7 +121,7 @@ void Pointer::print() const
void Pointer::printXml() const
{}
-VariableStackBindings Pointer::printAsm(VariableStackBindings bindings, int &) const
+Bindings Pointer::printAsm(Bindings bindings, int &) const
{
return bindings;
}
@@ -144,7 +144,7 @@ TypePtr Pointer::type(TypePtr type_ptr)
return type_;
}
-void Pointer::increaseStackPosition(VariableStackBindings &bindings) const
+void Pointer::increaseStackPosition(Bindings &bindings) const
{
bindings.increaseStackPosition(4);
}
@@ -221,7 +221,7 @@ void TypeContainer::print() const
void TypeContainer::printXml() const
{}
-VariableStackBindings TypeContainer::printAsm(VariableStackBindings bindings, int &) const
+Bindings TypeContainer::printAsm(Bindings bindings, int &) const
{
return bindings;
}
@@ -246,7 +246,7 @@ TypePtr TypeContainer::type(TypePtr type_ptr)
return type_;
}
-void TypeContainer::increaseStackPosition(VariableStackBindings &bindings) const
+void TypeContainer::increaseStackPosition(Bindings &bindings) const
{
type_->increaseStackPosition(bindings);
}
@@ -338,12 +338,12 @@ void Int::print() const
void Int::printXml() const
{}
-VariableStackBindings Int::printAsm(VariableStackBindings bindings, int &) const
+Bindings Int::printAsm(Bindings bindings, int &) const
{
return bindings;
}
-void Int::increaseStackPosition(VariableStackBindings &bindings) const
+void Int::increaseStackPosition(Bindings &bindings) const
{
bindings.increaseStackPosition(4);
}
@@ -392,12 +392,12 @@ void Void::print() const
void Void::printXml() const
{}
-VariableStackBindings Void::printAsm(VariableStackBindings bindings, int &) const
+Bindings Void::printAsm(Bindings bindings, int &) const
{
return bindings;
}
-void Void::increaseStackPosition(VariableStackBindings &) const
+void Void::increaseStackPosition(Bindings &) const
{}
void Void::load() const
@@ -434,12 +434,12 @@ void Short::print() const
void Short::printXml() const
{}
-VariableStackBindings Short::printAsm(VariableStackBindings bindings, int &) const
+Bindings Short::printAsm(Bindings bindings, int &) const
{
return bindings;
}
-void Short::increaseStackPosition(VariableStackBindings &bindings) const
+void Short::increaseStackPosition(Bindings &bindings) const
{
bindings.increaseStackPosition(2);
}
@@ -488,12 +488,12 @@ void Char::print() const
void Char::printXml() const
{}
-VariableStackBindings Char::printAsm(VariableStackBindings bindings, int &) const
+Bindings Char::printAsm(Bindings bindings, int &) const
{
return bindings;
}
-void Char::increaseStackPosition(VariableStackBindings &bindings) const
+void Char::increaseStackPosition(Bindings &bindings) const
{
bindings.increaseStackPosition(1);
}
@@ -542,12 +542,12 @@ void Float::print() const
void Float::printXml() const
{}
-VariableStackBindings Float::printAsm(VariableStackBindings bindings, int &) const
+Bindings Float::printAsm(Bindings bindings, int &) const
{
return bindings;
}
-void Float::increaseStackPosition(VariableStackBindings &bindings) const
+void Float::increaseStackPosition(Bindings &bindings) const
{
bindings.increaseStackPosition(4);
}
diff --git a/run_test_deliverable.sh b/run_test_deliverable.sh
index 2fb3f89..bbb36b9 100755
--- a/run_test_deliverable.sh
+++ b/run_test_deliverable.sh
@@ -35,11 +35,11 @@ for DRIVER in test_deliverable/testcases/*_driver.c ; do
fi
# Compile test function with compiler under test to assembly
- cat $TESTCODE | $COMPILER > working/$NAME.s 2> working/${NAME}.compile.stderr
- if [[ $? -ne 0 ]]; then
- printf "\e[1;31mError\e[0m : Compiler returned error message.\n"
- continue
- fi
+ # cat $TESTCODE | $COMPILER > working/$NAME.s 2> working/${NAME}.compile.stderr
+ # if [[ $? -ne 0 ]]; then
+ # printf "\e[1;31mError\e[0m : Compiler returned error message.\n"
+ # continue
+ # fi
# Link driver object and assembly into executable
mips-linux-gnu-gcc -static working/${NAME}.s working/${NAME}_driver.o -o working/${NAME}.elf 2> working/${NAME}.link.stderr
@@ -49,10 +49,10 @@ for DRIVER in test_deliverable/testcases/*_driver.c ; do
fi
# Run the actual executable
- qemu-mips working/${NAME}.elf
+ qemu-mips working/${NAME}.elf > working/$NAME.elf.stdout
RESULT=$?
if [[ "$RESULT" -ne 0 ]]; then
- >&2 printf "\e[1;31mError\e[0m : Testcase returned $RESULT, but expected 0.\n"
+ printf "\e[1;31mError\e[0m : Testcase returned $RESULT, but expected 0.\n"
continue
fi
diff --git a/test_deliverable/testcases/test_MAINPRINT0.c b/test_deliverable/testcases/test_MAINPRINT0.c
new file mode 100644
index 0000000..bc00fba
--- /dev/null
+++ b/test_deliverable/testcases/test_MAINPRINT0.c
@@ -0,0 +1,7 @@
+int printf(const char *format, ...);
+
+int main(int argc, char *argv[])
+{
+ printf("program name : %s\nInput variables : %d\n", argv[0], argc);
+ return 0;
+}
diff --git a/test_deliverable/testcases/test_MAINPRINT0_driver.c b/test_deliverable/testcases/test_MAINPRINT0_driver.c
new file mode 100644
index 0000000..53c5fdf
--- /dev/null
+++ b/test_deliverable/testcases/test_MAINPRINT0_driver.c
@@ -0,0 +1 @@
+#include <stdio.h>
diff --git a/test_deliverable/testcases/test_MAINPRINTF.c b/test_deliverable/testcases/test_MAINPRINTF.c
new file mode 100644
index 0000000..62ddab6
--- /dev/null
+++ b/test_deliverable/testcases/test_MAINPRINTF.c
@@ -0,0 +1,8 @@
+int printf(const char *format, ...);
+
+int main()
+{
+ char input[50] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', };
+ printf(input);
+ return 0;
+}
diff --git a/test_deliverable/testcases/test_MAINPRINTF_driver.c b/test_deliverable/testcases/test_MAINPRINTF_driver.c
new file mode 100644
index 0000000..53c5fdf
--- /dev/null
+++ b/test_deliverable/testcases/test_MAINPRINTF_driver.c
@@ -0,0 +1 @@
+#include <stdio.h>
diff --git a/test_deliverable/testcases/test_SHORTADD.c b/test_deliverable/testcases/test_SHORTADD.c
new file mode 100644
index 0000000..393aa78
--- /dev/null
+++ b/test_deliverable/testcases/test_SHORTADD.c
@@ -0,0 +1,5 @@
+short shortadd(short a, short b, short signed int c, short signed d, short e)
+{
+ short f = a+b-c+d-e;
+ return f;
+}
diff --git a/test_deliverable/testcases/test_SHORTADD_driver.c b/test_deliverable/testcases/test_SHORTADD_driver.c
new file mode 100644
index 0000000..95db6ef
--- /dev/null
+++ b/test_deliverable/testcases/test_SHORTADD_driver.c
@@ -0,0 +1,6 @@
+short shortadd(short, short, short, short, short);
+
+int main()
+{
+ return !( 3009 == shortadd(934, 2392, 293, 50, 74) );
+}
diff --git a/test_deliverable/testcases/test_STRINGLIT.c b/test_deliverable/testcases/test_STRINGLIT.c
new file mode 100644
index 0000000..36bcfd5
--- /dev/null
+++ b/test_deliverable/testcases/test_STRINGLIT.c
@@ -0,0 +1,5 @@
+char *stringlit(char * input)
+{
+ input = "Hello World!";
+ return input;
+}
diff --git a/test_deliverable/testcases/test_STRINGLIT_driver.c b/test_deliverable/testcases/test_STRINGLIT_driver.c
new file mode 100644
index 0000000..29af1ea
--- /dev/null
+++ b/test_deliverable/testcases/test_STRINGLIT_driver.c
@@ -0,0 +1,9 @@
+#include <string.h>
+
+char *stringlit(char *);
+
+int main()
+{
+ char a[50];
+ return strcmp(stringlit(a), "Hello World!");
+}