diff --git a/grammar/grammar.y b/grammar/grammar.y index 0f6d787..304f7e6 100644 --- a/grammar/grammar.y +++ b/grammar/grammar.y @@ -80,9 +80,9 @@ statement(A) ::= T_IF T_LPAREN expr(E) T_RPAREN statement(S). { A = new IfStatement(E, S); } statement(A) ::= T_RIF T_LPAREN expr(P) T_RPAREN statement(S). { A = new RandomIfStatement(P, S); } -statement(A) ::= T_FOR T_LPAREN expr(INIT) T_SEMICOLON expr(COND) T_SEMICOLON expr(STEP) T_RPAREN statement(S). +statement(A) ::= T_FOR T_LPAREN statement(INIT) T_SEMICOLON expr(COND) T_SEMICOLON statement(STEP) T_RPAREN statement(S). { A = new ForStatement(INIT, COND, STEP, S); } -statement(A) ::= T_RFOR T_LPAREN expr(INIT) T_SEMICOLON expr(P) T_SEMICOLON expr(STEP) T_RPAREN statement(S). +statement(A) ::= T_RFOR T_LPAREN statement(INIT) T_SEMICOLON expr(P) T_SEMICOLON statement(STEP) T_RPAREN statement(S). { A = new RandomForStatement(INIT, P, STEP, S); } statement(A) ::= T_RETURN expr(E) T_SEMICOLON. { A = new ReturnStatement(E); } statement(A) ::= T_BEGIN statements(S) T_END. { A = new Scope(S); } diff --git a/inc/AST/ForStatement.h b/inc/AST/ForStatement.h index a25beba..fb7fd94 100644 --- a/inc/AST/ForStatement.h +++ b/inc/AST/ForStatement.h @@ -6,19 +6,19 @@ class ForStatement : public Statement { public: - ForStatement(Expression* init, Expression* cond, Expression* step, Statement* stmt); + ForStatement(Statement* init, Expression* cond, Statement* step, Statement* stmt); virtual ~ForStatement(); virtual void accept(ASTVisitor* visitor); - Expression* getInit(); + Statement *getInit(); Expression* getCond(); - Expression* getStep(); + Statement* getStep(); Statement* getStmt(); private: - Expression* init_; + Statement* init_; Expression* cond_; - Expression* step_; + Statement* step_; Statement* stmt_; }; diff --git a/inc/AST/RandomForStatement.h b/inc/AST/RandomForStatement.h index 0d508a5..7db2fcd 100644 --- a/inc/AST/RandomForStatement.h +++ b/inc/AST/RandomForStatement.h @@ -7,19 +7,19 @@ class RandomForStatement : public Statement { public: - RandomForStatement(Expression* init, Expression* prob, Expression* step, Statement* stmt); + RandomForStatement(Statement *init, Expression* prob, Statement *step, Statement* stmt); virtual ~RandomForStatement(); virtual void accept(ASTVisitor *visitor); - Expression* getInit(); + Statement* getInit(); Expression* getProb(); - Expression* getStep(); + Statement *getStep(); Statement* getStmt(); private: - Expression* init_; + Statement* init_; Expression* prob_; - Expression* step_; + Statement* step_; Statement* stmt_; }; diff --git a/src/AST/CodeGenVisitor.cpp b/src/AST/CodeGenVisitor.cpp index ea6468a..9a7aeab 100644 --- a/src/AST/CodeGenVisitor.cpp +++ b/src/AST/CodeGenVisitor.cpp @@ -46,6 +46,9 @@ void CodeGenVisitor::visit(BinOpExpression* e) { case BinOp::EQUALS: value_ = builder_->CreateICmpEQ(lhs, rhs, "eqtmp"); break; + case BinOp::LESS: + value_ = builder_->CreateICmpSLT(lhs, rhs, "eqtmp"); + break; default: // TODO error break; diff --git a/src/AST/ForStatement.cpp b/src/AST/ForStatement.cpp index c64b637..0eb4e4b 100644 --- a/src/AST/ForStatement.cpp +++ b/src/AST/ForStatement.cpp @@ -1,7 +1,7 @@ #include "AST/ForStatement.h" #include "AST/ASTVisitor.h" -ForStatement::ForStatement(Expression *init, Expression *cond, Expression *step, Statement *stmt) : init_(init), cond_(cond), step_(step), stmt_(stmt) { +ForStatement::ForStatement(Statement *init, Expression *cond, Statement *step, Statement *stmt) : init_(init), cond_(cond), step_(step), stmt_(stmt) { // } @@ -13,7 +13,7 @@ void ForStatement::accept(ASTVisitor* visitor) { visitor->visit(this); } -Expression* ForStatement::getInit() { +Statement* ForStatement::getInit() { return init_; } @@ -21,7 +21,7 @@ Expression* ForStatement::getCond() { return cond_; } -Expression* ForStatement::getStep() { +Statement* ForStatement::getStep() { return step_; } diff --git a/src/AST/RandomForStatement.cpp b/src/AST/RandomForStatement.cpp index e4b6172..e1c48d6 100644 --- a/src/AST/RandomForStatement.cpp +++ b/src/AST/RandomForStatement.cpp @@ -1,7 +1,7 @@ #include "AST/RandomForStatement.h" #include "AST/ASTVisitor.h" -RandomForStatement::RandomForStatement(Expression *init, Expression *prob, Expression *step, Statement *stmt) : init_(init),prob_(prob),step_(step),stmt_(stmt) +RandomForStatement::RandomForStatement(Statement *init, Expression *prob, Statement *step, Statement *stmt) : init_(init),prob_(prob),step_(step),stmt_(stmt) { // } @@ -14,7 +14,7 @@ void RandomForStatement::accept(ASTVisitor *visitor) { visitor->visit(this); } -Expression* RandomForStatement::getInit() { +Statement *RandomForStatement::getInit() { return init_; } @@ -22,7 +22,7 @@ Expression* RandomForStatement::getProb() { return prob_; } -Expression* RandomForStatement::getStep() { +Statement* RandomForStatement::getStep() { return step_; } diff --git a/src/test.cpp b/src/test.cpp index 666702a..98a3566 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -127,7 +127,7 @@ int main() { lexertl::lookup (state_machine, results); std::string s(results.start, results.end); if (results.id != T_WHITESPACE) { - std::cout << "Id: " << results.id << ", Token: " << s << std::endl; + //std::cout << "Id: " << results.id << ", Token: " << s << std::endl; scullyParser(parser, results.id, new Token(s), cv); } } while (results.id != 0);