aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorymherklotz <ymherklotz@gmail.com>2017-03-10 18:53:29 +0000
committerymherklotz <ymherklotz@gmail.com>2017-03-10 18:53:29 +0000
commitfc4486443f1af75526306377437cb82c2c9f37ac (patch)
treed1058fc594c49b7cb4064f34855464d9fc3ecb89
parent7a61349a09b4db96794a2a90d2d488f020885442 (diff)
downloadCompiler-fc4486443f1af75526306377437cb82c2c9f37ac.tar.gz
Compiler-fc4486443f1af75526306377437cb82c2c9f37ac.zip
Passing all my tests for now
-rw-r--r--c_compiler/GRTAGSbin98304 -> 98304 bytes
-rw-r--r--c_compiler/GTAGSbin57344 -> 57344 bytes
-rw-r--r--c_compiler/include/expression.hpp12
-rw-r--r--c_compiler/src/c_parser.y2
-rw-r--r--c_compiler/src/expression.cpp20
5 files changed, 33 insertions, 1 deletions
diff --git a/c_compiler/GRTAGS b/c_compiler/GRTAGS
index 4a1db03..f6e85c0 100644
--- a/c_compiler/GRTAGS
+++ b/c_compiler/GRTAGS
Binary files differ
diff --git a/c_compiler/GTAGS b/c_compiler/GTAGS
index b730179..e0846e7 100644
--- a/c_compiler/GTAGS
+++ b/c_compiler/GTAGS
Binary files differ
diff --git a/c_compiler/include/expression.hpp b/c_compiler/include/expression.hpp
index d77d9d5..2476de1 100644
--- a/c_compiler/include/expression.hpp
+++ b/c_compiler/include/expression.hpp
@@ -39,6 +39,18 @@ public:
};
+class AdditiveExpression : public OperationExpression
+{
+private:
+ std::string operand;
+
+public:
+ AdditiveExpression(Expression* _lhs, const std::string& _operand, Expression* _rhs);
+
+ virtual VariableStackBindings printasm(VariableStackBindings bindings) const;
+};
+
+
class Identifier : public Expression
{
private:
diff --git a/c_compiler/src/c_parser.y b/c_compiler/src/c_parser.y
index c762151..dd609ee 100644
--- a/c_compiler/src/c_parser.y
+++ b/c_compiler/src/c_parser.y
@@ -278,7 +278,7 @@ ShiftExpression:
AdditiveExpression:
MultiplicativeExpression { $$ = $1; }
- | AdditiveExpression T_ADDSUB_OP MultiplicativeExpression { $$ = $3; }
+| AdditiveExpression T_ADDSUB_OP MultiplicativeExpression { $$ = new AdditiveExpression($1, *$2, $3); }
;
MultiplicativeExpression:
diff --git a/c_compiler/src/expression.cpp b/c_compiler/src/expression.cpp
index 29bfe0d..8935e37 100644
--- a/c_compiler/src/expression.cpp
+++ b/c_compiler/src/expression.cpp
@@ -50,6 +50,26 @@ VariableStackBindings AssignmentExpression::printasm(VariableStackBindings bindi
}
+// Additive Expression definition
+
+AdditiveExpression::AdditiveExpression(Expression* _lhs, const std::string& _operand, Expression* _rhs)
+ : OperationExpression(_lhs, _rhs), operand(_operand)
+{}
+
+VariableStackBindings AdditiveExpression::printasm(VariableStackBindings bindings) const
+{
+ rhs->printasm(bindings);
+
+ std::cout << "\tmove\t$3,$2" << std::endl;
+
+ lhs->printasm(bindings);
+
+ std::cout << "\tadd\t$2,$2,$3" << std::endl;
+
+ return bindings;
+}
+
+
// Identifier definition
Identifier::Identifier(const std::string& id)