diff --git a/spec/propane_spec.rb b/spec/propane_spec.rb index f69aedf..f5fd48d 100644 --- a/spec/propane_spec.rb +++ b/spec/propane_spec.rb @@ -1081,7 +1081,7 @@ EOF expect(results.status).to eq 0 end - it "stores the token position in the AST Token node" do + it "stores token and rule positions in AST nodes" do write_grammar < T Start; +Start -> ; +T -> a A; +A -> bb? c?; +EOF + run_propane(language: language) + compile("spec/test_ast_invalid_positions.#{language}", language: language) + results = run_test + expect(results.stderr).to eq "" + expect(results.status).to eq 0 + end end end end diff --git a/spec/test_ast_invalid_positions.c b/spec/test_ast_invalid_positions.c new file mode 100644 index 0000000..513dc10 --- /dev/null +++ b/spec/test_ast_invalid_positions.c @@ -0,0 +1,102 @@ +#include "testparser.h" +#include +#include +#include "testutils.h" + +int main() +{ + char const * input = "\na\n bb ccc"; + p_context_t context; + p_context_init(&context, (uint8_t const *)input, strlen(input)); + assert(p_parse(&context) == P_SUCCESS); + Start * start = p_result(&context); + + assert_eq(1, start->pT1->pToken->position.row); + assert_eq(0, start->pT1->pToken->position.col); + assert_eq(1, start->pT1->pToken->end_position.row); + assert_eq(0, start->pT1->pToken->end_position.col); + assert(p_position_valid(start->pT1->pA->position)); + assert_eq(2, start->pT1->pA->position.row); + assert_eq(2, start->pT1->pA->position.col); + assert_eq(2, start->pT1->pA->end_position.row); + assert_eq(7, start->pT1->pA->end_position.col); + assert_eq(1, start->pT1->position.row); + assert_eq(0, start->pT1->position.col); + assert_eq(2, start->pT1->end_position.row); + assert_eq(7, start->pT1->end_position.col); + + assert_eq(1, start->position.row); + assert_eq(0, start->position.col); + assert_eq(2, start->end_position.row); + assert_eq(7, start->end_position.col); + + input = "a\nbb"; + p_context_init(&context, (uint8_t const *)input, strlen(input)); + assert(p_parse(&context) == P_SUCCESS); + start = p_result(&context); + + assert_eq(0, start->pT1->pToken->position.row); + assert_eq(0, start->pT1->pToken->position.col); + assert_eq(0, start->pT1->pToken->end_position.row); + assert_eq(0, start->pT1->pToken->end_position.col); + assert(p_position_valid(start->pT1->pA->position)); + assert_eq(1, start->pT1->pA->position.row); + assert_eq(0, start->pT1->pA->position.col); + assert_eq(1, start->pT1->pA->end_position.row); + assert_eq(1, start->pT1->pA->end_position.col); + assert_eq(0, start->pT1->position.row); + assert_eq(0, start->pT1->position.col); + assert_eq(1, start->pT1->end_position.row); + assert_eq(1, start->pT1->end_position.col); + + assert_eq(0, start->position.row); + assert_eq(0, start->position.col); + assert_eq(1, start->end_position.row); + assert_eq(1, start->end_position.col); + + input = "a\nc\nc"; + p_context_init(&context, (uint8_t const *)input, strlen(input)); + assert(p_parse(&context) == P_SUCCESS); + start = p_result(&context); + + assert_eq(0, start->pT1->pToken->position.row); + assert_eq(0, start->pT1->pToken->position.col); + assert_eq(0, start->pT1->pToken->end_position.row); + assert_eq(0, start->pT1->pToken->end_position.col); + assert(p_position_valid(start->pT1->pA->position)); + assert_eq(1, start->pT1->pA->position.row); + assert_eq(0, start->pT1->pA->position.col); + assert_eq(2, start->pT1->pA->end_position.row); + assert_eq(0, start->pT1->pA->end_position.col); + assert_eq(0, start->pT1->position.row); + assert_eq(0, start->pT1->position.col); + assert_eq(2, start->pT1->end_position.row); + assert_eq(0, start->pT1->end_position.col); + + assert_eq(0, start->position.row); + assert_eq(0, start->position.col); + assert_eq(2, start->end_position.row); + assert_eq(0, start->end_position.col); + + input = "a"; + p_context_init(&context, (uint8_t const *)input, strlen(input)); + assert(p_parse(&context) == P_SUCCESS); + start = p_result(&context); + + assert_eq(0, start->pT1->pToken->position.row); + assert_eq(0, start->pT1->pToken->position.col); + assert_eq(0, start->pT1->pToken->end_position.row); + assert_eq(0, start->pT1->pToken->end_position.col); + assert(!p_position_valid(start->pT1->pA->position)); + assert_eq(0, start->pT1->position.row); + assert_eq(0, start->pT1->position.col); + assert_eq(0, start->pT1->end_position.row); + assert_eq(0, start->pT1->end_position.col); + + assert_eq(0, start->position.row); + assert_eq(0, start->position.col); + assert_eq(0, start->end_position.row); + assert_eq(0, start->end_position.col); + + return 0; +} diff --git a/spec/test_ast_invalid_positions.d b/spec/test_ast_invalid_positions.d new file mode 100644 index 0000000..0737454 --- /dev/null +++ b/spec/test_ast_invalid_positions.d @@ -0,0 +1,104 @@ +import testparser; +import std.stdio; +import testutils; + +int main() +{ + return 0; +} + +unittest +{ + string input = "\na\n bb ccc"; + p_context_t context; + p_context_init(&context, input); + assert(p_parse(&context) == P_SUCCESS); + Start * start = p_result(&context); + + assert_eq(1, start.pT1.pToken.position.row); + assert_eq(0, start.pT1.pToken.position.col); + assert_eq(1, start.pT1.pToken.end_position.row); + assert_eq(0, start.pT1.pToken.end_position.col); + assert(start.pT1.pA.position.valid); + assert_eq(2, start.pT1.pA.position.row); + assert_eq(2, start.pT1.pA.position.col); + assert_eq(2, start.pT1.pA.end_position.row); + assert_eq(7, start.pT1.pA.end_position.col); + assert_eq(1, start.pT1.position.row); + assert_eq(0, start.pT1.position.col); + assert_eq(2, start.pT1.end_position.row); + assert_eq(7, start.pT1.end_position.col); + + assert_eq(1, start.position.row); + assert_eq(0, start.position.col); + assert_eq(2, start.end_position.row); + assert_eq(7, start.end_position.col); + + input = "a\nbb"; + p_context_init(&context, input); + assert(p_parse(&context) == P_SUCCESS); + start = p_result(&context); + + assert_eq(0, start.pT1.pToken.position.row); + assert_eq(0, start.pT1.pToken.position.col); + assert_eq(0, start.pT1.pToken.end_position.row); + assert_eq(0, start.pT1.pToken.end_position.col); + assert(start.pT1.pA.position.valid); + assert_eq(1, start.pT1.pA.position.row); + assert_eq(0, start.pT1.pA.position.col); + assert_eq(1, start.pT1.pA.end_position.row); + assert_eq(1, start.pT1.pA.end_position.col); + assert_eq(0, start.pT1.position.row); + assert_eq(0, start.pT1.position.col); + assert_eq(1, start.pT1.end_position.row); + assert_eq(1, start.pT1.end_position.col); + + assert_eq(0, start.position.row); + assert_eq(0, start.position.col); + assert_eq(1, start.end_position.row); + assert_eq(1, start.end_position.col); + + input = "a\nc\nc"; + p_context_init(&context, input); + assert(p_parse(&context) == P_SUCCESS); + start = p_result(&context); + + assert_eq(0, start.pT1.pToken.position.row); + assert_eq(0, start.pT1.pToken.position.col); + assert_eq(0, start.pT1.pToken.end_position.row); + assert_eq(0, start.pT1.pToken.end_position.col); + assert(start.pT1.pA.position.valid); + assert_eq(1, start.pT1.pA.position.row); + assert_eq(0, start.pT1.pA.position.col); + assert_eq(2, start.pT1.pA.end_position.row); + assert_eq(0, start.pT1.pA.end_position.col); + assert_eq(0, start.pT1.position.row); + assert_eq(0, start.pT1.position.col); + assert_eq(2, start.pT1.end_position.row); + assert_eq(0, start.pT1.end_position.col); + + assert_eq(0, start.position.row); + assert_eq(0, start.position.col); + assert_eq(2, start.end_position.row); + assert_eq(0, start.end_position.col); + + input = "a"; + p_context_init(&context, input); + assert(p_parse(&context) == P_SUCCESS); + start = p_result(&context); + + assert_eq(0, start.pT1.pToken.position.row); + assert_eq(0, start.pT1.pToken.position.col); + assert_eq(0, start.pT1.pToken.end_position.row); + assert_eq(0, start.pT1.pToken.end_position.col); + assert(!start.pT1.pA.position.valid); + assert_eq(0, start.pT1.position.row); + assert_eq(0, start.pT1.position.col); + assert_eq(0, start.pT1.end_position.row); + assert_eq(0, start.pT1.end_position.col); + + assert_eq(0, start.position.row); + assert_eq(0, start.position.col); + assert_eq(0, start.end_position.row); + assert_eq(0, start.end_position.col); +} diff --git a/spec/test_ast_token_positions.c b/spec/test_ast_token_positions.c index 09c835b..ff4ea79 100644 --- a/spec/test_ast_token_positions.c +++ b/spec/test_ast_token_positions.c @@ -82,4 +82,3 @@ int main() return 0; } -