diff --git a/.travis.yml b/.travis.yml index 14f1536..ac07ffb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,4 +43,4 @@ deploy: branch: master env: global: -secure: cEgIAN379G8SJa+JFJhzpa6vBbdjDdgz7PXXakgYh+voGJkPZ63JBNSQYKFqrGGrlV0YiLRAhjopHxrqsmmg/W6Y47QWzMipB2koMABabmFFUlmXT9WmDqTVguUEZVxw5y2MNGEtGrJ9nUOXB6Mo4PiGSbOiEX8CB4FQ+CLM602+j0Skj9C5ToPKxRufK6j9ZqG1QNjauexK3LavcVvnAD8Twl1svkb+nqypwNQKLsfoURgZicQmXDUig0zp32j4WfTnw13ndHTElPZTxYi2+diT61GEIJMEg0a9TjIPn0tLG0KEEqUkpipWUXiLU1i/hTBAHZ3PTv+iTFFJtBMlJdk3BFkmml+h6krvugguiEtQh5gMkwN/uGyaOxuZCSFpsKm/leDuCCcFl8WRLn1h3bZFXwRr7JIfVrAHKOrMuXbyg4zZXDN/GRRYExkx9vgmQRg3Gf0TF9GY1S2aFtcgt/8z9GD0r9/J8vkW5hfAa+0Fv6FDtiPRegNE1cKR4Jaa1WkXJUqeNgUVQogfKi5WhiH1gg9jAKrxts34dB5kM5n3NGgfgbgmQzA75JnCmJOyEwqPHnttApl1TRCEsJat6ajFF2xoD/cBlLZu9jNmIKAALoTgr+N6c7y9+v19DrZslAp2NY3G8TcBmKZzJZwuPXnDKsORXn9AmM/m2qbjXzQ= + secure: cEgIAN379G8SJa+JFJhzpa6vBbdjDdgz7PXXakgYh+voGJkPZ63JBNSQYKFqrGGrlV0YiLRAhjopHxrqsmmg/W6Y47QWzMipB2koMABabmFFUlmXT9WmDqTVguUEZVxw5y2MNGEtGrJ9nUOXB6Mo4PiGSbOiEX8CB4FQ+CLM602+j0Skj9C5ToPKxRufK6j9ZqG1QNjauexK3LavcVvnAD8Twl1svkb+nqypwNQKLsfoURgZicQmXDUig0zp32j4WfTnw13ndHTElPZTxYi2+diT61GEIJMEg0a9TjIPn0tLG0KEEqUkpipWUXiLU1i/hTBAHZ3PTv+iTFFJtBMlJdk3BFkmml+h6krvugguiEtQh5gMkwN/uGyaOxuZCSFpsKm/leDuCCcFl8WRLn1h3bZFXwRr7JIfVrAHKOrMuXbyg4zZXDN/GRRYExkx9vgmQRg3Gf0TF9GY1S2aFtcgt/8z9GD0r9/J8vkW5hfAa+0Fv6FDtiPRegNE1cKR4Jaa1WkXJUqeNgUVQogfKi5WhiH1gg9jAKrxts34dB5kM5n3NGgfgbgmQzA75JnCmJOyEwqPHnttApl1TRCEsJat6ajFF2xoD/cBlLZu9jNmIKAALoTgr+N6c7y9+v19DrZslAp2NY3G8TcBmKZzJZwuPXnDKsORXn9AmM/m2qbjXzQ= diff --git a/examples/Declarations.grace b/examples/Declarations.grace index c1c5f51..9d0138c 100644 --- a/examples/Declarations.grace +++ b/examples/Declarations.grace @@ -2,7 +2,7 @@ def x = "Hello"; def y = x.++(" World"); def obj = object { method add(n) to(t) { - n + t + n + t; } var val := 2; }; diff --git a/examples/Variables.grace b/examples/Variables.grace index 1a1e377..09f32b0 100644 --- a/examples/Variables.grace +++ b/examples/Variables.grace @@ -2,7 +2,7 @@ def x = "Hello"; def y = x.++(" World"); def obj = object { method add(n) to(t) { - n + t + n + t; } var val := add(2)to(3); }; diff --git a/grammars/GraceParser.g4 b/grammars/GraceParser.g4 index bafbf58..ab1080a 100644 --- a/grammars/GraceParser.g4 +++ b/grammars/GraceParser.g4 @@ -70,7 +70,7 @@ void doAfter() {} * Parser Rules */ program: (statement)*; -statement: expression | declaration; //| control; +statement: expression DELIMITER | declaration; //| control; declaration : variableDeclaration | constantDeclaration @@ -92,7 +92,7 @@ formalParameterList: formalParameter (COMMA formalParameter)*; formalParameter: identifier; methodBody: OPEN_BRACE methodBodyLine* CLOSE_BRACE; -methodBodyLine: variableDeclaration | constantDeclaration | expression; //| control; +methodBodyLine: variableDeclaration | constantDeclaration | expression DELIMITER; //| control; // Using left-recursion and implicit operator precendence. ANTLR 4 Reference, page 70 expression : rec=expression op=(MUL | DIV) param=expression #MulDivExp diff --git a/interpreter/CMakeLists.txt b/interpreter/CMakeLists.txt index 839a066..753778f 100644 --- a/interpreter/CMakeLists.txt +++ b/interpreter/CMakeLists.txt @@ -30,4 +30,4 @@ include_directories(${antlr4cpp_include_dirs_naylang}) add_executable(interpreter ${SOURCE_FILES} ${antlr4cpp_src_files_naylang}) add_dependencies(interpreter antlr4cpp antlr4cpp_generation_naylang) -target_link_libraries(interpreter antlr4-runtime) +target_link_libraries(interpreter libantlr4-runtime.a) diff --git a/interpreter/src/core/model/ast/Statement.h b/interpreter/src/core/model/ast/Statement.h index ac26fc9..e331af5 100644 --- a/interpreter/src/core/model/ast/Statement.h +++ b/interpreter/src/core/model/ast/Statement.h @@ -17,9 +17,20 @@ class Statement; typedef std::shared_ptr StatementPtr; class Statement { +protected: + + int _line; + int _col; + public: + Statement() : _line{-1}, _col{-1} {} + Statement(int line, int col) : _line{line}, _col{col} {} + virtual void accept(Evaluator &evaluator) = 0; + + int line() {return _line;} + int col() {return _col;} }; } diff --git a/interpreter/src/core/model/ast/control/IfThen.cpp b/interpreter/src/core/model/ast/control/IfThen.cpp index 8e59576..85bae9e 100644 --- a/interpreter/src/core/model/ast/control/IfThen.cpp +++ b/interpreter/src/core/model/ast/control/IfThen.cpp @@ -6,8 +6,11 @@ #include "IfThen.h" namespace naylang { +IfThen::IfThen(ExpressionPtr condition, BlockPtr thenExp, int line, int col) : + _condition{condition}, _then{thenExp}, IfThen::Statement(line, col) {} + IfThen::IfThen(ExpressionPtr condition, BlockPtr thenExp) : - _condition{condition}, _then{thenExp} {} + IfThen(condition, thenExp, -1, -1) {} void IfThen::accept(Evaluator &evaluator) { evaluator.evaluate(*this); diff --git a/interpreter/src/core/model/ast/control/IfThen.h b/interpreter/src/core/model/ast/control/IfThen.h index 4631a40..8fef5eb 100644 --- a/interpreter/src/core/model/ast/control/IfThen.h +++ b/interpreter/src/core/model/ast/control/IfThen.h @@ -18,6 +18,11 @@ class IfThen : public Statement { public: + IfThen( + ExpressionPtr condition, + BlockPtr thenExp, + int line, int col); + IfThen( ExpressionPtr condition, BlockPtr thenExp); diff --git a/interpreter/src/core/model/ast/control/IfThenElse.cpp b/interpreter/src/core/model/ast/control/IfThenElse.cpp index d0e0870..4c51791 100644 --- a/interpreter/src/core/model/ast/control/IfThenElse.cpp +++ b/interpreter/src/core/model/ast/control/IfThenElse.cpp @@ -9,7 +9,11 @@ namespace naylang { IfThenElse::IfThenElse( ExpressionPtr condition, BlockPtr thenExp, - BlockPtr elseExp) { + BlockPtr elseExp) : + IfThenElse(condition, thenExp, elseExp, -1, -1) {} + +IfThenElse::IfThenElse(ExpressionPtr condition, BlockPtr thenExp, BlockPtr elseExp, int line, int col) : + IfThenElse::Statement(line, col) { _condition = std::move(condition); _then = std::move(thenExp); _else = std::move(elseExp); diff --git a/interpreter/src/core/model/ast/control/IfThenElse.h b/interpreter/src/core/model/ast/control/IfThenElse.h index b7b7aa4..ca386c2 100644 --- a/interpreter/src/core/model/ast/control/IfThenElse.h +++ b/interpreter/src/core/model/ast/control/IfThenElse.h @@ -19,6 +19,11 @@ class IfThenElse : public Statement { public: + IfThenElse( + ExpressionPtr condition, + BlockPtr thenExp, + BlockPtr elseExp, + int line, int col); IfThenElse( ExpressionPtr condition, BlockPtr thenExp, diff --git a/interpreter/src/core/model/ast/control/Return.cpp b/interpreter/src/core/model/ast/control/Return.cpp index 8e28d32..153532c 100644 --- a/interpreter/src/core/model/ast/control/Return.cpp +++ b/interpreter/src/core/model/ast/control/Return.cpp @@ -10,7 +10,13 @@ namespace naylang { +Return::Return(int line, int col) : + Return::Statement(line, col) {} + +Return::Return() : Return::Statement() {} + void Return::accept(Evaluator &evaluator) { evaluator.evaluate(*this); } + } \ No newline at end of file diff --git a/interpreter/src/core/model/ast/control/Return.h b/interpreter/src/core/model/ast/control/Return.h index 6831dcc..a23c30b 100644 --- a/interpreter/src/core/model/ast/control/Return.h +++ b/interpreter/src/core/model/ast/control/Return.h @@ -12,6 +12,9 @@ namespace naylang { class Return : public Statement { public: + Return(int line, int col); + Return(); + virtual void accept(Evaluator &evaluator); }; } // end namespace naylang diff --git a/interpreter/src/core/model/ast/control/While.cpp b/interpreter/src/core/model/ast/control/While.cpp index eefafe0..10e5f7b 100644 --- a/interpreter/src/core/model/ast/control/While.cpp +++ b/interpreter/src/core/model/ast/control/While.cpp @@ -10,8 +10,11 @@ namespace naylang { +While::While(BlockPtr condition, BlockPtr body, int line, int col) : + _condition{condition}, _body{body}, While::Statement(line, col) {} + While::While(BlockPtr condition, BlockPtr body) : - _condition{condition}, _body{body} {} + While(condition, body, -1, -1) {} void While::accept(Evaluator &evaluator) { evaluator.evaluate(*this); @@ -24,5 +27,4 @@ const std::shared_ptr &While::condition() const { const std::shared_ptr &While::body() const { return _body; } - } \ No newline at end of file diff --git a/interpreter/src/core/model/ast/control/While.h b/interpreter/src/core/model/ast/control/While.h index 7ffab0c..bc66998 100644 --- a/interpreter/src/core/model/ast/control/While.h +++ b/interpreter/src/core/model/ast/control/While.h @@ -19,6 +19,7 @@ class While : public Statement { BlockPtr _body; public: + While(BlockPtr condition, BlockPtr body, int line, int col); While(BlockPtr condition, BlockPtr body); void accept(Evaluator &evaluator) override; diff --git a/interpreter/src/core/model/ast/declarations/ConstantDeclaration.cpp b/interpreter/src/core/model/ast/declarations/ConstantDeclaration.cpp index c5680fd..423c093 100644 --- a/interpreter/src/core/model/ast/declarations/ConstantDeclaration.cpp +++ b/interpreter/src/core/model/ast/declarations/ConstantDeclaration.cpp @@ -7,8 +7,11 @@ namespace naylang { +ConstantDeclaration::ConstantDeclaration(const std::string &identifier, ExpressionPtr value, int line, int col) : + _name{identifier}, _value(value), Declaration::Declaration(line, col) {} + ConstantDeclaration::ConstantDeclaration(const std::string &name, ExpressionPtr value) : - _name(name), _value(value) {} + ConstantDeclaration(name, value, -1, -1){} void ConstantDeclaration::accept(Evaluator &evaluator) { evaluator.evaluate(*this); diff --git a/interpreter/src/core/model/ast/declarations/ConstantDeclaration.h b/interpreter/src/core/model/ast/declarations/ConstantDeclaration.h index d02dc07..de1d6ac 100644 --- a/interpreter/src/core/model/ast/declarations/ConstantDeclaration.h +++ b/interpreter/src/core/model/ast/declarations/ConstantDeclaration.h @@ -21,6 +21,10 @@ class ConstantDeclaration : public Declaration { public: + ConstantDeclaration( + const std::string &identifier, + ExpressionPtr value, + int line, int col); ConstantDeclaration(const std::string &identifier, ExpressionPtr value); virtual void accept(Evaluator &evaluator); diff --git a/interpreter/src/core/model/ast/declarations/Declaration.h b/interpreter/src/core/model/ast/declarations/Declaration.h index 81367a0..81902f5 100644 --- a/interpreter/src/core/model/ast/declarations/Declaration.h +++ b/interpreter/src/core/model/ast/declarations/Declaration.h @@ -18,6 +18,8 @@ typedef std::shared_ptr DeclarationPtr; class Declaration : public Statement { public: + Declaration(int line, int col) : Statement(line, col) {} + virtual void accept(Evaluator &evaluator) = 0; virtual const std::string &name() const = 0; }; diff --git a/interpreter/src/core/model/ast/declarations/MethodDeclaration.cpp b/interpreter/src/core/model/ast/declarations/MethodDeclaration.cpp index e1518b8..eafbcdd 100644 --- a/interpreter/src/core/model/ast/declarations/MethodDeclaration.cpp +++ b/interpreter/src/core/model/ast/declarations/MethodDeclaration.cpp @@ -9,7 +9,11 @@ namespace naylang { MethodDeclaration::MethodDeclaration(const std::string &name, const std::vector ¶ms, const std::vector &body) : - _name{name}, _params{params}, _body{body}{} + MethodDeclaration(name, params, body, -1, -1) {} + +MethodDeclaration::MethodDeclaration(const std::string &name, const std::vector ¶ms, + const std::vector &body, int line, int col) : + _name{name}, _params{params}, _body{body}, MethodDeclaration::Declaration(line, col) {} void MethodDeclaration::accept(Evaluator &evaluator) { evaluator.evaluate(*this); diff --git a/interpreter/src/core/model/ast/declarations/MethodDeclaration.h b/interpreter/src/core/model/ast/declarations/MethodDeclaration.h index e0dc31f..1c4b89f 100644 --- a/interpreter/src/core/model/ast/declarations/MethodDeclaration.h +++ b/interpreter/src/core/model/ast/declarations/MethodDeclaration.h @@ -19,6 +19,12 @@ class MethodDeclaration : public Declaration { std::vector _body; public: + MethodDeclaration( + const std::string &name, + const std::vector ¶ms, + const std::vector &body, + int line, int col); + MethodDeclaration( const std::string &name, const std::vector ¶ms, diff --git a/interpreter/src/core/model/ast/declarations/VariableDeclaration.cpp b/interpreter/src/core/model/ast/declarations/VariableDeclaration.cpp index f4a69f3..5a56633 100644 --- a/interpreter/src/core/model/ast/declarations/VariableDeclaration.cpp +++ b/interpreter/src/core/model/ast/declarations/VariableDeclaration.cpp @@ -7,11 +7,18 @@ namespace naylang { -VariableDeclaration::VariableDeclaration(const std::string &identifier) - : _identifier(identifier) {} +VariableDeclaration::VariableDeclaration(const std::string &identifier, ExpressionPtr initialValue, int line, int col) : + _identifier{identifier}, _initialValue{initialValue}, + VariableDeclaration::Declaration(line, col) {} -VariableDeclaration::VariableDeclaration(const std::string &identifier, ExpressionPtr intialValue) : - _identifier{identifier}, _initialValue{intialValue} {} +VariableDeclaration::VariableDeclaration(const std::string &identifier, int line, int col) : + VariableDeclaration(identifier, nullptr, line, col) {} + +VariableDeclaration::VariableDeclaration(const std::string &identifier, ExpressionPtr initialValue) : + VariableDeclaration(identifier, initialValue, -1, -1) {} + +VariableDeclaration::VariableDeclaration(const std::string &identifier) : + VariableDeclaration(identifier, -1, -1) {} void VariableDeclaration::accept(Evaluator &evaluator) { evaluator.evaluate(*this); diff --git a/interpreter/src/core/model/ast/declarations/VariableDeclaration.h b/interpreter/src/core/model/ast/declarations/VariableDeclaration.h index 9ca726e..0cd02f3 100644 --- a/interpreter/src/core/model/ast/declarations/VariableDeclaration.h +++ b/interpreter/src/core/model/ast/declarations/VariableDeclaration.h @@ -19,8 +19,10 @@ class VariableDeclaration : public Declaration { public: - VariableDeclaration(const std::string &identifier); + VariableDeclaration(const std::string &identifier, ExpressionPtr intialValue, int line, int col); VariableDeclaration(const std::string &identifier, ExpressionPtr intialValue); + VariableDeclaration(const std::string &identifier, int line, int col); + VariableDeclaration(const std::string &identifier); virtual void accept(Evaluator &evaluator); const std::string &name() const; diff --git a/interpreter/src/core/model/ast/expressions/Block.cpp b/interpreter/src/core/model/ast/expressions/Block.cpp index 52e18b9..50c23ed 100644 --- a/interpreter/src/core/model/ast/expressions/Block.cpp +++ b/interpreter/src/core/model/ast/expressions/Block.cpp @@ -10,6 +10,10 @@ namespace naylang { +Block::Block(int line, int col) : Expression(line, col) {} + +Block::Block() : Block(-1, -1) {} + void Block::accept(Evaluator &evaluator) { evaluator.evaluate(*this); } @@ -29,9 +33,4 @@ void Block::addStatement(StatementPtr statement) { void Block::addParameter(DeclarationPtr param) { _params.push_back(param); } - -BlockPtr Block::get_shared() { - return shared_from_this(); -} - } \ No newline at end of file diff --git a/interpreter/src/core/model/ast/expressions/Block.h b/interpreter/src/core/model/ast/expressions/Block.h index a216b19..f725a76 100644 --- a/interpreter/src/core/model/ast/expressions/Block.h +++ b/interpreter/src/core/model/ast/expressions/Block.h @@ -24,7 +24,8 @@ class Block : public Expression, public std::enable_shared_from_this { public: - Block() = default; + Block(int line, int col); + Block(); void accept(Evaluator &evaluator) override; @@ -33,7 +34,6 @@ class Block : public Expression, public std::enable_shared_from_this { void addStatement(StatementPtr statement); void addParameter(DeclarationPtr param); - BlockPtr get_shared(); }; } // end namespace naylang diff --git a/interpreter/src/core/model/ast/expressions/Expression.h b/interpreter/src/core/model/ast/expressions/Expression.h index cbb9158..23d6ef9 100644 --- a/interpreter/src/core/model/ast/expressions/Expression.h +++ b/interpreter/src/core/model/ast/expressions/Expression.h @@ -17,6 +17,8 @@ typedef std::shared_ptr ExpressionPtr; class Expression : public Statement { public: + Expression(int line, int col) : Statement(line, col) {} + virtual void accept(Evaluator &evaluator) = 0; }; } diff --git a/interpreter/src/core/model/ast/expressions/Lineup.cpp b/interpreter/src/core/model/ast/expressions/Lineup.cpp index da9d197..e4d456a 100644 --- a/interpreter/src/core/model/ast/expressions/Lineup.cpp +++ b/interpreter/src/core/model/ast/expressions/Lineup.cpp @@ -10,13 +10,22 @@ namespace naylang { +Lineup::Lineup(const std::vector &values, int line, int col) : + _contents{values}, Expression(line, col) {} + +Lineup::Lineup(int line, int col) : + Lineup({}, line, col) {} + +Lineup::Lineup(const std::vector &values) : + Lineup(values, -1, -1) {} + +Lineup::Lineup() : + Lineup({}, -1, -1) {} + void Lineup::accept(Evaluator &evaluator) { evaluator.evaluate(*this); } -Lineup::Lineup(const std::vector &values) : - _contents{values} {} - const std::vector &Lineup::contents() const { return _contents; } diff --git a/interpreter/src/core/model/ast/expressions/Lineup.h b/interpreter/src/core/model/ast/expressions/Lineup.h index f23fa9c..114df9b 100644 --- a/interpreter/src/core/model/ast/expressions/Lineup.h +++ b/interpreter/src/core/model/ast/expressions/Lineup.h @@ -18,8 +18,10 @@ class Lineup : public Expression { public: - Lineup() = default; + Lineup(const std::vector &values, int line, int col); Lineup(const std::vector &values); + Lineup(int line, int col); + Lineup(); virtual void accept(Evaluator &evaluator); diff --git a/interpreter/src/core/model/ast/expressions/ObjectConstructor.cpp b/interpreter/src/core/model/ast/expressions/ObjectConstructor.cpp index 9e494da..9cd4076 100644 --- a/interpreter/src/core/model/ast/expressions/ObjectConstructor.cpp +++ b/interpreter/src/core/model/ast/expressions/ObjectConstructor.cpp @@ -10,7 +10,11 @@ namespace naylang { -ObjectConstructor::ObjectConstructor(const std::vector &statements) : _statements{statements} {} +ObjectConstructor::ObjectConstructor(const std::vector &statements, int line, int col) : + _statements{statements}, Expression(line, col) {} + +ObjectConstructor::ObjectConstructor(const std::vector &statements) : + ObjectConstructor(statements, -1, -1){} void ObjectConstructor::accept(Evaluator &evaluator) { evaluator.evaluate(*this); diff --git a/interpreter/src/core/model/ast/expressions/ObjectConstructor.h b/interpreter/src/core/model/ast/expressions/ObjectConstructor.h index 9a85c0f..1223a18 100644 --- a/interpreter/src/core/model/ast/expressions/ObjectConstructor.h +++ b/interpreter/src/core/model/ast/expressions/ObjectConstructor.h @@ -15,6 +15,7 @@ class ObjectConstructor : public Expression { std::vector _statements; public: + ObjectConstructor(const std::vector &statements, int line, int col); ObjectConstructor(const std::vector &statements); virtual void accept(Evaluator &evaluator); diff --git a/interpreter/src/core/model/ast/expressions/primitives/BooleanLiteral.cpp b/interpreter/src/core/model/ast/expressions/primitives/BooleanLiteral.cpp index 6159346..f895c4c 100644 --- a/interpreter/src/core/model/ast/expressions/primitives/BooleanLiteral.cpp +++ b/interpreter/src/core/model/ast/expressions/primitives/BooleanLiteral.cpp @@ -6,7 +6,10 @@ #include "BooleanLiteral.h" namespace naylang { -BooleanLiteral::BooleanLiteral(bool value) : _value(value) {} +BooleanLiteral::BooleanLiteral(bool value) : BooleanLiteral(value, -1, -1) {} + +BooleanLiteral::BooleanLiteral(bool value, int line, int col) : + _value(value), Expression(line, col) {} void BooleanLiteral::accept(Evaluator &evaluator) { evaluator.evaluate(*this); diff --git a/interpreter/src/core/model/ast/expressions/primitives/BooleanLiteral.h b/interpreter/src/core/model/ast/expressions/primitives/BooleanLiteral.h index dca8ab8..5347dfe 100644 --- a/interpreter/src/core/model/ast/expressions/primitives/BooleanLiteral.h +++ b/interpreter/src/core/model/ast/expressions/primitives/BooleanLiteral.h @@ -15,6 +15,7 @@ class BooleanLiteral : public Expression { public: + BooleanLiteral(bool value, int line, int col); BooleanLiteral(bool value); virtual void accept(Evaluator &evaluator); diff --git a/interpreter/src/core/model/ast/expressions/primitives/CharLiteral.cpp b/interpreter/src/core/model/ast/expressions/primitives/CharLiteral.cpp index 8aa5d3d..46396fc 100644 --- a/interpreter/src/core/model/ast/expressions/primitives/CharLiteral.cpp +++ b/interpreter/src/core/model/ast/expressions/primitives/CharLiteral.cpp @@ -7,7 +7,10 @@ namespace naylang { -CharLiteral::CharLiteral(char value) : _value(value) {} +CharLiteral::CharLiteral(char value) : CharLiteral(value, -1, -1) {} + +CharLiteral::CharLiteral(char value, int line, int col) : + _value(value), Expression(line, col) {} void CharLiteral::accept(Evaluator &evaluator) { evaluator.evaluate(*this); diff --git a/interpreter/src/core/model/ast/expressions/primitives/CharLiteral.h b/interpreter/src/core/model/ast/expressions/primitives/CharLiteral.h index fd4005b..9befc36 100644 --- a/interpreter/src/core/model/ast/expressions/primitives/CharLiteral.h +++ b/interpreter/src/core/model/ast/expressions/primitives/CharLiteral.h @@ -16,6 +16,7 @@ class CharLiteral : public Expression { public: + CharLiteral(char value, int line, int col); CharLiteral(char value); virtual void accept(Evaluator &evaluator); diff --git a/interpreter/src/core/model/ast/expressions/primitives/NumberLiteral.cpp b/interpreter/src/core/model/ast/expressions/primitives/NumberLiteral.cpp index 3e510ff..dfe7688 100644 --- a/interpreter/src/core/model/ast/expressions/primitives/NumberLiteral.cpp +++ b/interpreter/src/core/model/ast/expressions/primitives/NumberLiteral.cpp @@ -7,7 +7,11 @@ namespace naylang { -NumberLiteral::NumberLiteral(double value) : _value(value) {} +NumberLiteral::NumberLiteral(double value, int line, int col) : + _value(value), Expression(line, col) {} + +NumberLiteral::NumberLiteral(double value) : + NumberLiteral(value, -1, -1) {} void NumberLiteral::accept(Evaluator &evaluator) { evaluator.evaluate(*this); diff --git a/interpreter/src/core/model/ast/expressions/primitives/NumberLiteral.h b/interpreter/src/core/model/ast/expressions/primitives/NumberLiteral.h index ed7651b..95a2c52 100644 --- a/interpreter/src/core/model/ast/expressions/primitives/NumberLiteral.h +++ b/interpreter/src/core/model/ast/expressions/primitives/NumberLiteral.h @@ -16,7 +16,9 @@ class NumberLiteral : public Expression { public: + NumberLiteral(double value, int line, int col); NumberLiteral(double value); + virtual void accept(Evaluator &evaluator); virtual bool operator==(const NumberLiteral &other); diff --git a/interpreter/src/core/model/ast/expressions/primitives/StringLiteral.cpp b/interpreter/src/core/model/ast/expressions/primitives/StringLiteral.cpp index a5a0540..52d7b8b 100644 --- a/interpreter/src/core/model/ast/expressions/primitives/StringLiteral.cpp +++ b/interpreter/src/core/model/ast/expressions/primitives/StringLiteral.cpp @@ -7,7 +7,11 @@ namespace naylang { -StringLiteral::StringLiteral(const std::string &_value) : _value(_value) {} +StringLiteral::StringLiteral(const std::string &value, int line, int col) : + _value{value}, Expression(line, col) {} + +StringLiteral::StringLiteral(const std::string &value) : + StringLiteral(value, -1, -1) {} void StringLiteral::accept(Evaluator &evaluator) { evaluator.evaluate(*this); diff --git a/interpreter/src/core/model/ast/expressions/primitives/StringLiteral.h b/interpreter/src/core/model/ast/expressions/primitives/StringLiteral.h index ed35214..c39c9c2 100644 --- a/interpreter/src/core/model/ast/expressions/primitives/StringLiteral.h +++ b/interpreter/src/core/model/ast/expressions/primitives/StringLiteral.h @@ -19,7 +19,8 @@ class StringLiteral : public Expression { public: - StringLiteral(const std::string &_value); + StringLiteral(const std::string &value, int line, int col); + StringLiteral(const std::string &value); void accept(Evaluator &evaluator); diff --git a/interpreter/src/core/model/ast/expressions/requests/ExplicitRequestNode.cpp b/interpreter/src/core/model/ast/expressions/requests/ExplicitRequestNode.cpp index 2f816a9..3cd44b1 100644 --- a/interpreter/src/core/model/ast/expressions/requests/ExplicitRequestNode.cpp +++ b/interpreter/src/core/model/ast/expressions/requests/ExplicitRequestNode.cpp @@ -8,12 +8,19 @@ namespace naylang { ExplicitRequestNode::ExplicitRequestNode(const std::string &method, ExpressionPtr receiver) : - _receiver{receiver}, RequestNode::RequestNode(method) {} + _receiver{receiver}, RequestNode::RequestNode(method) {} + +ExplicitRequestNode::ExplicitRequestNode(const std::string &method, ExpressionPtr receiver, int line, int col) : + _receiver{receiver}, RequestNode::RequestNode(method, line, col) {} ExplicitRequestNode::ExplicitRequestNode(const std::string &method, ExpressionPtr receiver, const std::vector ¶ms) : _receiver{receiver}, RequestNode::RequestNode(method, params) {} +ExplicitRequestNode::ExplicitRequestNode(const std::string &method, ExpressionPtr receiver, + const std::vector ¶ms, int line, int col) : + _receiver{receiver}, ExplicitRequestNode::RequestNode(method, params, line, col) {} + const ExpressionPtr &ExplicitRequestNode::receiver() const { return _receiver; } diff --git a/interpreter/src/core/model/ast/expressions/requests/ExplicitRequestNode.h b/interpreter/src/core/model/ast/expressions/requests/ExplicitRequestNode.h index f0e904b..8dd2385 100644 --- a/interpreter/src/core/model/ast/expressions/requests/ExplicitRequestNode.h +++ b/interpreter/src/core/model/ast/expressions/requests/ExplicitRequestNode.h @@ -16,8 +16,10 @@ class ExplicitRequestNode : public RequestNode { public: - ExplicitRequestNode(const std::string &method, ExpressionPtr receiver); + ExplicitRequestNode(const std::string &method, ExpressionPtr receiver, const std::vector ¶ms, int line, int col); ExplicitRequestNode(const std::string &method, ExpressionPtr receiver, const std::vector ¶ms); + ExplicitRequestNode(const std::string &method, ExpressionPtr receiver, int line, int col); + ExplicitRequestNode(const std::string &method, ExpressionPtr receiver); virtual void accept(Evaluator &evaluator); diff --git a/interpreter/src/core/model/ast/expressions/requests/ImplicitRequestNode.cpp b/interpreter/src/core/model/ast/expressions/requests/ImplicitRequestNode.cpp index 15f370e..bab9b6d 100644 --- a/interpreter/src/core/model/ast/expressions/requests/ImplicitRequestNode.cpp +++ b/interpreter/src/core/model/ast/expressions/requests/ImplicitRequestNode.cpp @@ -8,10 +8,17 @@ namespace naylang { ImplicitRequestNode::ImplicitRequestNode(const std::string &methodName) : - RequestNode::RequestNode(methodName) {} + RequestNode::RequestNode(methodName) {} + +ImplicitRequestNode::ImplicitRequestNode(const std::string &methodName, int line, int col) : + RequestNode(methodName, line, col) {} ImplicitRequestNode::ImplicitRequestNode(const std::string &methodName, const std::vector ¶ms) : - RequestNode::RequestNode(methodName, params) {} + RequestNode(methodName, params) {} + +ImplicitRequestNode::ImplicitRequestNode(const std::string &methodName, const std::vector ¶ms, + int line, int col) : + RequestNode(methodName, params, line, col) {} void ImplicitRequestNode::accept(Evaluator &evaluator) { evaluator.evaluate(*this); diff --git a/interpreter/src/core/model/ast/expressions/requests/ImplicitRequestNode.h b/interpreter/src/core/model/ast/expressions/requests/ImplicitRequestNode.h index 258ae59..ddd0c0b 100644 --- a/interpreter/src/core/model/ast/expressions/requests/ImplicitRequestNode.h +++ b/interpreter/src/core/model/ast/expressions/requests/ImplicitRequestNode.h @@ -18,8 +18,10 @@ class ImplicitRequestNode : public RequestNode { public: - ImplicitRequestNode(const std::string &methodName); + ImplicitRequestNode(const std::string &methodName, const std::vector ¶ms, int line, int col); ImplicitRequestNode(const std::string &methodName, const std::vector ¶ms); + ImplicitRequestNode(const std::string &methodName, int line, int col); + ImplicitRequestNode(const std::string &methodName); void accept(Evaluator &evaluator) override; diff --git a/interpreter/src/core/model/ast/expressions/requests/RequestNode.cpp b/interpreter/src/core/model/ast/expressions/requests/RequestNode.cpp index 961a0a4..65973fa 100644 --- a/interpreter/src/core/model/ast/expressions/requests/RequestNode.cpp +++ b/interpreter/src/core/model/ast/expressions/requests/RequestNode.cpp @@ -7,11 +7,18 @@ namespace naylang { -RequestNode::RequestNode(const std::string &methodName) : - _name{methodName}, _declaration{nullptr} {} +RequestNode::RequestNode(const std::string &methodName, const std::vector ¶ms, int line, int col) : + _name{methodName}, _params{params}, _declaration{nullptr}, + Expression(line, col) {} RequestNode::RequestNode(const std::string &methodName, const std::vector ¶ms) : - _name{methodName}, _params{params}, _declaration{nullptr} {} + RequestNode(methodName, params, -1, -1) {} + +RequestNode::RequestNode(const std::string &methodName) : + RequestNode(methodName, {}) {} + +RequestNode::RequestNode(const std::string &methodName, int line, int col) : + RequestNode::RequestNode(methodName, {}, line, col) {} const std::string &RequestNode::identifier() const { return _name; diff --git a/interpreter/src/core/model/ast/expressions/requests/RequestNode.h b/interpreter/src/core/model/ast/expressions/requests/RequestNode.h index bd006e7..dfc08ac 100644 --- a/interpreter/src/core/model/ast/expressions/requests/RequestNode.h +++ b/interpreter/src/core/model/ast/expressions/requests/RequestNode.h @@ -28,8 +28,10 @@ class RequestNode : public Expression { public: - RequestNode(const std::string &methodName); + RequestNode(const std::string &methodName, const std::vector ¶ms, int line, int col); RequestNode(const std::string &methodName, const std::vector ¶ms); + RequestNode(const std::string &methodName, int line, int col); + RequestNode(const std::string &methodName); const std::string &identifier() const; const std::vector ¶ms() const; diff --git a/interpreter/src/core/parser/NaylangParserVisitor.cpp b/interpreter/src/core/parser/NaylangParserVisitor.cpp index 7762c1c..d0d57d9 100644 --- a/interpreter/src/core/parser/NaylangParserVisitor.cpp +++ b/interpreter/src/core/parser/NaylangParserVisitor.cpp @@ -77,15 +77,15 @@ antlrcpp::Any NaylangParserVisitor::visitPrefixExp(GraceParser::PrefixExpContext auto opname = popPartialStr(); ctx->rec->accept(this); auto rec = popPartialExp(); - pushPartialExp(make_node(opname, rec)); + pushPartialExp(make_node(opname, rec, getLine(ctx), getCol(ctx))); return 0; } + antlrcpp::Any NaylangParserVisitor::visitNumber(GraceParser::NumberContext *ctx) { - pushPartialExp(make_node(std::stod(ctx->getText()))); + pushPartialExp(make_node(std::stod(ctx->getText()), getLine(ctx), getCol(ctx))); return 0; } - antlrcpp::Any NaylangParserVisitor::visitMulDivExp(GraceParser::MulDivExpContext *ctx) { ctx->rec->accept(this); auto reciever = popPartialExp(); @@ -93,7 +93,7 @@ antlrcpp::Any NaylangParserVisitor::visitMulDivExp(GraceParser::MulDivExpContext auto param = popPartialExp(); auto op = ctx->op->getText() + "(_)"; std::vector params{param}; - pushPartialExp(make_node(op, reciever, params)); + pushPartialExp(make_node(op, reciever, params, getLine(ctx), getCol(ctx))); return 0; } @@ -104,19 +104,19 @@ antlrcpp::Any NaylangParserVisitor::visitAddSubExp(GraceParser::AddSubExpContext auto param = popPartialExp(); auto op = ctx->op->getText() + "(_)"; std::vector params{param}; - pushPartialExp(make_node(op, reciever, params)); + pushPartialExp(make_node(op, reciever, params, getLine(ctx), getCol(ctx))); return 0; } antlrcpp::Any NaylangParserVisitor::visitString(GraceParser::StringContext *ctx) { auto contents = ctx->content->getText(); - pushPartialExp(make_node(contents)); + pushPartialExp(make_node(contents, getLine(ctx), getCol(ctx))); return 0; } antlrcpp::Any NaylangParserVisitor::visitBoolean(GraceParser::BooleanContext *ctx) { bool value = ctx->TRUE() != nullptr; - pushPartialExp(make_node(value)); + pushPartialExp(make_node(value, getLine(ctx), getCol(ctx))); return 0; } @@ -125,7 +125,7 @@ antlrcpp::Any NaylangParserVisitor::visitConstantDeclaration(GraceParser::Consta auto name = popPartialStr(); ctx->expression()->accept(this); auto value = popPartialExp(); - pushPartialDecl(make_node(name, value)); + pushPartialDecl(make_node(name, value, getLine(ctx), getCol(ctx))); return 0; } @@ -139,7 +139,7 @@ antlrcpp::Any NaylangParserVisitor::visitVariableDeclaration(GraceParser::Variab auto name = popPartialStr(); ctx->expression()->accept(this); auto value = popPartialExp(); - pushPartialDecl(make_node(name, value)); + pushPartialDecl(make_node(name, value, getLine(ctx), getCol(ctx))); return 0; } @@ -161,10 +161,11 @@ antlrcpp::Any NaylangParserVisitor::visitUserMethod(GraceParser::UserMethodConte int bodyLength = ctx->methodBody()->methodBodyLine().size(); auto body = popPartialStats(bodyLength); - auto methodDeclaration = make_node(methodName, formalParams, body); + auto methodDeclaration = make_node(methodName, formalParams, body, getLine(ctx), getCol(ctx)); pushPartialDecl(methodDeclaration); return 0; } + antlrcpp::Any NaylangParserVisitor::visitMethodSignature(GraceParser::MethodSignatureContext *ctx) { clearPartials(); for (auto i : ctx->methodSignaturePart()) { @@ -172,7 +173,6 @@ antlrcpp::Any NaylangParserVisitor::visitMethodSignature(GraceParser::MethodSign } return 0; } - antlrcpp::Any NaylangParserVisitor::visitMethodSignaturePart(GraceParser::MethodSignaturePartContext *ctx) { auto partName = ctx->identifier()->getText(); if (ctx->formalParameterList()->formalParameter().size() != 0) { @@ -199,7 +199,7 @@ antlrcpp::Any NaylangParserVisitor::visitFormalParameterList(GraceParser::Formal } antlrcpp::Any NaylangParserVisitor::visitFormalParameter(GraceParser::FormalParameterContext *ctx) { - pushPartialDecl(make_node(ctx->identifier()->getText())); + pushPartialDecl(make_node(ctx->identifier()->getText(), getLine(ctx), getCol(ctx))); return 0; } @@ -222,13 +222,13 @@ antlrcpp::Any NaylangParserVisitor::visitPrefixMethod(GraceParser::PrefixMethodC body.push_back(line); } - auto methodDeclaration = make_node(methodName, formalParams, body); + auto methodDeclaration = make_node(methodName, formalParams, body, getLine(ctx), getCol(ctx)); pushPartialDecl(methodDeclaration); return 0; } antlrcpp::Any NaylangParserVisitor::visitIdentifierImplReq(GraceParser::IdentifierImplReqContext *ctx) { - pushPartialExp(make_node(ctx->getText())); + pushPartialExp(make_node(ctx->getText(), getLine(ctx), getCol(ctx))); return 0; } @@ -237,7 +237,7 @@ antlrcpp::Any NaylangParserVisitor::visitOneParamImplReq(GraceParser::OneParamIm ctx->effectiveParameter()->accept(this); auto effectiveParam = popPartialExp(); std::vector params{effectiveParam}; - pushPartialExp(make_node(name, params)); + pushPartialExp(make_node(name, params, getLine(ctx), getCol(ctx))); return 0; } @@ -261,7 +261,7 @@ antlrcpp::Any NaylangParserVisitor::visitMultipartRequest(GraceParser::Multipart auto effectiveParams = popPartialExps(totalParams); - pushPartialExp(make_node(methodName, effectiveParams)); + pushPartialExp(make_node(methodName, effectiveParams, getLine(ctx), getCol(ctx))); return 0; } @@ -296,7 +296,7 @@ antlrcpp::Any NaylangParserVisitor::visitImplReqExplReq(GraceParser::ImplReqExpl auto rec = popPartialExp(); ctx->req->accept(this); auto req = static_cast(*popPartialExp()); - pushPartialExp(make_node(req.identifier(), rec, req.params())); + pushPartialExp(make_node(req.identifier(), rec, req.params(), getLine(ctx), getCol(ctx))); return 0; } @@ -306,12 +306,12 @@ antlrcpp::Any NaylangParserVisitor::visitObjectConstructor(GraceParser::ObjectCo stat->accept(this); } auto lines = popPartialStats(statements); - pushPartialExp(make_node(lines)); + pushPartialExp(make_node(lines, getLine(ctx), getCol(ctx))); return 0; } antlrcpp::Any NaylangParserVisitor::visitBlock(GraceParser::BlockContext *ctx) { - auto block = make_node(); + auto block = make_node(getLine(ctx), getCol(ctx)); for (auto line : ctx->methodBodyLine()) { line->accept(this); @@ -335,7 +335,7 @@ antlrcpp::Any NaylangParserVisitor::visitLineup(GraceParser::LineupContext *ctx) int elems = ctx->lineupContents()->expression().size(); ctx->lineupContents()->accept(this); auto content = popPartialExps(elems); - pushPartialExp(make_node(content)); + pushPartialExp(make_node(content, getLine(ctx), getCol(ctx))); return 0; } @@ -347,4 +347,12 @@ antlrcpp::Any NaylangParserVisitor::visitProgram(GraceParser::ProgramContext *ct } return 0; } + +int NaylangParserVisitor::getCol(const antlr4::ParserRuleContext *ctx) const { + return ctx->start->getCharPositionInLine(); +} + +int NaylangParserVisitor::getLine(const antlr4::ParserRuleContext *ctx) const { + return ctx->start->getLine(); +} } \ No newline at end of file diff --git a/interpreter/src/core/parser/NaylangParserVisitor.h b/interpreter/src/core/parser/NaylangParserVisitor.h index 2075d2d..3441bb9 100644 --- a/interpreter/src/core/parser/NaylangParserVisitor.h +++ b/interpreter/src/core/parser/NaylangParserVisitor.h @@ -87,6 +87,9 @@ class NaylangParserVisitor : public GraceParserBaseVisitor { void clearPartials(); antlrcpp::Any defaultResult(); + + int getLine(const antlr4::ParserRuleContext *ctx) const; + int getCol(const antlr4::ParserRuleContext *ctx) const; }; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b352474..61a962a 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -23,4 +23,4 @@ set(SOURCE_FILES ${SOURCE_FILES} ${PARSER_SOURCES}) add_executable(tests ${SOURCE_FILES} ${antlr4cpp_src_files_naylang}) add_dependencies(tests antlr4cpp antlr4cpp_generation_naylang) -target_link_libraries(tests antlr4-runtime) +target_link_libraries(tests libantlr4-runtime.a) diff --git a/tests/src/core/model/ast/Statement_test.cpp b/tests/src/core/model/ast/Statement_test.cpp new file mode 100644 index 0000000..0c8d08f --- /dev/null +++ b/tests/src/core/model/ast/Statement_test.cpp @@ -0,0 +1,26 @@ +// +// Copyright (c) 2017 by Borja Lorente. +// Distributed under the GPLv3 license. +// + +#include +#include +#include "catch.h" + +using namespace naylang; + +TEST_CASE("Statements", "[AST]") { + SECTION("Statements can contain code coordinates") { + int lineNum = 0; + int colNum = 1; + StatementPtr node = make_node("Hello", lineNum, colNum); + REQUIRE(node->line() == lineNum); + REQUIRE(node->col() == colNum); + } + + SECTION("Statements have coordinates (-1, -1) by default") { + StatementPtr node = make_node(4); + REQUIRE(node->line() == -1); + REQUIRE(node->col() == -1); + } +} \ No newline at end of file diff --git a/tests/src/core/model/ast/control/Return_test.cpp b/tests/src/core/model/ast/control/Return_test.cpp index bc01ac8..818d112 100644 --- a/tests/src/core/model/ast/control/Return_test.cpp +++ b/tests/src/core/model/ast/control/Return_test.cpp @@ -10,6 +10,6 @@ using namespace naylang; TEST_CASE("Return statements", "[Control]") { SECTION("A return statement takes no parameters") { - Return ret; + Return ret(0, 0); } } \ No newline at end of file diff --git a/tests/src/core/model/evaluators/ExecutionEvaluator_test.cpp b/tests/src/core/model/evaluators/ExecutionEvaluator_test.cpp index 53d817b..034277a 100644 --- a/tests/src/core/model/evaluators/ExecutionEvaluator_test.cpp +++ b/tests/src/core/model/evaluators/ExecutionEvaluator_test.cpp @@ -17,7 +17,7 @@ using namespace naylang; TEST_CASE("Execution Evaluator", "[Evaluators]") { - auto ret = make_node(); + auto ret = make_node(0, 0); auto truRef = make_node("tru"); auto falRef = make_node("fal"); auto xRef = make_node("x"); @@ -58,7 +58,7 @@ TEST_CASE("Execution Evaluator", "[Evaluators]") { SECTION("Evaluating a Return node terminates the execution") { // It assumes that the last executed expression is in the partial ExecutionEvaluator eval; - Return ret; + Return ret(0, 0); REQUIRE_NOTHROW(eval.evaluate(ret)); } diff --git a/tests/src/core/parser/NaylangParserVisitor_test.cpp b/tests/src/core/parser/NaylangParserVisitor_test.cpp index 6cfea38..9397856 100644 --- a/tests/src/core/parser/NaylangParserVisitor_test.cpp +++ b/tests/src/core/parser/NaylangParserVisitor_test.cpp @@ -35,7 +35,7 @@ TEST_CASE("Program", "[Naylang Parser Visitor]") { TEST_CASE("Naylang Parser Visitor", "[Parser]") { SECTION("Parsing -4 creates an explicit request 4.prefix-") { - auto AST = translate("-4\n"); + auto AST = translate("-4;\n"); auto request = static_cast(*(AST[0])); auto receiver = static_cast(*request.receiver()); @@ -62,25 +62,25 @@ TEST_CASE("Naylang Parser Visitor", "[Parser]") { TEST_CASE("Primitives", "[Naylang Parser Visitor]") { SECTION("Parsing an integer creates a NumberLiteral") { - auto AST = translate("4\n"); + auto AST = translate("4\n;"); REQUIRE_NOTHROW(dynamic_cast(*(AST[0]))); REQUIRE_NOTHROW(dynamic_cast(*(AST[0])).value() == 4); } SECTION("Parsing a string in between quotes generates a StringLiteral") { - auto AST = translate("\"Hello\"\n"); + auto AST = translate("\"Hello\";\n"); REQUIRE_NOTHROW(dynamic_cast(*(AST[0])).value() == "Hello"); } SECTION("Parsing a boolean generates a BooleanLiteral") { - auto AST = translate("true\n"); + auto AST = translate("true;\n"); REQUIRE_NOTHROW(dynamic_cast(*(AST[0])).value()); } } TEST_CASE("Values", "[Naylang Parser Visitor]") { SECTION("Parsing \"object\" { /*some lines*/ } generates an ObjectConstructor node") { - auto AST = translate("object {def x = 5;}"); + auto AST = translate("object {def x = 5;};"); auto obj = static_cast(*(AST[0])); auto decl = static_cast(*obj.statements()[0]); auto value = static_cast(*decl.value()); @@ -90,7 +90,7 @@ TEST_CASE("Values", "[Naylang Parser Visitor]") { } SECTION("Parsing a parameterless block creates a Block") { - auto AST = translate("{def x = 5;}"); + auto AST = translate("{def x = 5;};"); auto obj = static_cast(*(AST[0])); auto decl = static_cast(*obj.body()[0]); auto value = static_cast(*decl.value()); @@ -100,7 +100,7 @@ TEST_CASE("Values", "[Naylang Parser Visitor]") { } SECTION("Parsing a block with parameter also creates a Block") { - auto AST = translate("{x -> x * 5}"); + auto AST = translate("{x -> x * 5;};"); auto obj = static_cast(*(AST[0])); auto decl = static_cast(*obj.body()[0]); auto param = static_cast(*obj.params()[0]); @@ -113,7 +113,7 @@ TEST_CASE("Values", "[Naylang Parser Visitor]") { } SECTION("Parsing [expr, expr, expr] creates a Lineup") { - auto AST = translate("[{x -> x * 5}, \"Hello\", 6]"); + auto AST = translate("[{x -> x * 5;}, \"Hello\", 6];"); auto lineup = static_cast(*(AST[0])); @@ -135,7 +135,7 @@ TEST_CASE("Values", "[Naylang Parser Visitor]") { } SECTION("Parsing an object constructor") { - GraceAST AST = translate("def obj = object {\nmethod add(n) to(t) {\nn + t\n}\nvar val := 2;\n};"); + GraceAST AST = translate("def obj = object {\nmethod add(n) to(t) {\nn + t;\n}\nvar val := 2;\n};"); auto objDecl = static_cast(*(AST[0])); REQUIRE(objDecl.name() == "obj"); @@ -183,7 +183,7 @@ TEST_CASE("Declarations", "[Naylang Parser Visitor]") { SECTION("Methods") { SECTION("Parsing 'method twice(n,m) { n * m }' creates a MethodDeclaration") { - auto AST = translate("method twice(n,m) { n * m }"); + auto AST = translate("method twice(n,m) { n * m; }"); auto decl = static_cast(*(AST[0])); auto inst = static_cast(*decl.body()[0]); auto recv = static_cast(*inst.receiver()); @@ -196,7 +196,7 @@ TEST_CASE("Declarations", "[Naylang Parser Visitor]") { } SECTION("Parsing 'method prefix!! { n * 2 }' creates a MethodDeclaration") { - auto AST = translate("method prefix! { 2 * 2 }"); + auto AST = translate("method prefix! { 2 * 2; }"); auto decl = static_cast(*(AST[0])); auto inst = static_cast(*decl.body()[0]); auto recv = static_cast(*inst.receiver()); @@ -211,14 +211,14 @@ TEST_CASE("Declarations", "[Naylang Parser Visitor]") { TEST_CASE("Requests", "[Naylang Parser Visitor]") { SECTION("Implicit Requests can be just an identifier") { - auto AST = translate("x"); + auto AST = translate("x;"); auto req = static_cast(*(AST[0])); REQUIRE(req.identifier() == "x"); REQUIRE(req.params().size() == 0); } SECTION("Implicit Requests with one parameter can omit the parentheses") { - auto AST = translate("print \"Hello\""); + auto AST = translate("print \"Hello\";"); auto req = static_cast(*(AST[0])); auto param = static_cast(*req.params()[0]); REQUIRE(req.identifier() == "print(_)"); @@ -226,7 +226,7 @@ TEST_CASE("Requests", "[Naylang Parser Visitor]") { } SECTION("Implicit Requests with more than one parameter have to have them in parentheses") { - auto AST = translate("twice(4, 5)"); + auto AST = translate("twice(4, 5);"); auto req = static_cast(*(AST[0])); auto four = static_cast(*req.params()[0]); auto five = static_cast(*req.params()[1]); @@ -236,7 +236,7 @@ TEST_CASE("Requests", "[Naylang Parser Visitor]") { } SECTION("Implicit Requests can have more than one part") { - auto AST = translate("twice(4) as (5)"); + auto AST = translate("twice(4) as (5);"); auto req = static_cast(*(AST[0])); auto four = static_cast(*req.params()[0]); auto five = static_cast(*req.params()[1]); @@ -246,7 +246,7 @@ TEST_CASE("Requests", "[Naylang Parser Visitor]") { } SECTION("Explicit Requests have a receiver") { - auto AST = translate("x.say(5)"); + auto AST = translate("x.say(5);"); auto req = static_cast(*(AST[0])); auto rec = static_cast(*req.receiver()); auto five = static_cast(*req.params()[0]); @@ -256,6 +256,21 @@ TEST_CASE("Requests", "[Naylang Parser Visitor]") { } } +TEST_CASE("Code Coordinates", "[Naylang Parser Visitor]") { + SECTION("The visitor assigns code coordinates to every statement") { + auto AST = translate("4;\n5;\nvar x := 4;\n"); + auto four = static_cast(*(AST[0])); + REQUIRE(four.line() == 1); + REQUIRE(four.col() == 0); + auto five = static_cast(*(AST[1])); + REQUIRE(five.line() == 2); + REQUIRE(five.col() == 0); + auto var = static_cast(*(AST[2])); + REQUIRE(var.line() == 3); + REQUIRE(var.col() == 0); + } +} + GraceAST translate(std::string line) { ANTLRInputStream stream(line); GraceLexer lexer(&stream);