Rename AST generation mode to tree generation mode

This commit is contained in:
josh committed 2026-02-09 21:59:00 -05:00
1 parent 6a87bb2d56
commit 77ec7c9de4
34 files changed
+279 -279

No files matched your search

+45 -45
View File
@@ -245,20 +245,20 @@ EOF
expect(results.status).to_not eq 0
end
it "errors when an alias is in different positions for different rules in a rule set when AST mode is enabled" do
it "errors when an alias is in different positions for different rules in a rule set when tree mode is enabled" do
write_grammar <<EOF
ast;
tree;
token a;
token b;
Start -> a:foo b;
Start -> b b:foo;
EOF
results = run_propane(extra_args: %w[-w], capture: true)
expect(results.stderr).to match %r{Error: conflicting AST node field positions for alias `foo`}
expect(results.stderr).to match %r{Error: conflicting tree node field positions for alias `foo`}
expect(results.status).to_not eq 0
end
it "does not error when an alias is in different positions for different rules in a rule set when AST mode is not enabled" do
it "does not error when an alias is in different positions for different rules in a rule set when tree mode is not enabled" do
write_grammar <<EOF
token a;
token b;
@@ -996,9 +996,9 @@ EOF
run_propane(language: language)
end
it "generates an AST" do
it "generates a tree" do
write_grammar <<EOF
ast;
tree;
ptype int;
@@ -1032,17 +1032,17 @@ One -> one;
Two -> two;
EOF
run_propane(language: language)
compile("spec/test_ast.#{language}", language: language)
compile("spec/test_tree.#{language}", language: language)
results = run_test(language: language)
expect(results.stderr).to eq ""
expect(results.status).to eq 0
end
it "supports AST node prefix and suffix" do
it "supports tree node prefix and suffix" do
write_grammar <<EOF
ast;
ast_prefix P ;
ast_suffix S;
tree;
tree_prefix P ;
tree_suffix S;
ptype int;
@@ -1076,7 +1076,7 @@ One -> one;
Two -> two;
EOF
run_propane(language: language)
compile("spec/test_ast_ps.#{language}", language: language)
compile("spec/test_tree_ps.#{language}", language: language)
results = run_test(language: language)
expect(results.stderr).to eq ""
expect(results.status).to eq 0
@@ -1092,15 +1092,15 @@ EOF
compile("spec/test_start_rule.#{language}", language: language)
end
it "allows specifying a different start rule with AST generation" do
it "allows specifying a different start rule with tree generation" do
write_grammar <<EOF
ast;
tree;
token hi;
start Top;
Top -> hi;
EOF
run_propane(language: language)
compile("spec/test_start_rule_ast.#{language}", language: language)
compile("spec/test_start_rule_tree.#{language}", language: language)
end
it "allows marking a rule component as optional" do
@@ -1167,10 +1167,10 @@ EOF
])
end
it "allows marking a rule component as optional in AST generation mode" do
it "allows marking a rule component as optional in tree generation mode" do
if language == "d"
write_grammar <<EOF
ast;
tree;
<<
import std.stdio;
@@ -1186,7 +1186,7 @@ R -> d c;
EOF
else
write_grammar <<EOF
ast;
tree;
<<
#include <stdio.h>
@@ -1202,16 +1202,16 @@ R -> d c;
EOF
end
run_propane(language: language)
compile("spec/test_optional_rule_component_ast.#{language}", language: language)
compile("spec/test_optional_rule_component_tree.#{language}", language: language)
results = run_test(language: language)
expect(results.stderr).to eq ""
expect(results.status).to eq 0
end
it "allows naming an optional rule component in AST generation mode" do
it "allows naming an optional rule component in tree generation mode" do
if language == "d"
write_grammar <<EOF
ast;
tree;
<<
import std.stdio;
@@ -1227,7 +1227,7 @@ R -> d c;
EOF
else
write_grammar <<EOF
ast;
tree;
<<
#include <stdio.h>
@@ -1243,15 +1243,15 @@ R -> d c;
EOF
end
run_propane(language: language)
compile("spec/test_named_optional_rule_component_ast.#{language}", language: language)
compile("spec/test_named_optional_rule_component_tree.#{language}", language: language)
results = run_test(language: language)
expect(results.stderr).to eq ""
expect(results.status).to eq 0
end
it "stores token and rule positions in AST nodes" do
it "stores token and rule positions in tree nodes" do
write_grammar <<EOF
ast;
tree;
token a;
token bb;
@@ -1263,7 +1263,7 @@ T -> bb;
T -> c;
EOF
run_propane(language: language)
compile("spec/test_ast_token_positions.#{language}", language: language)
compile("spec/test_tree_token_positions.#{language}", language: language)
results = run_test(language: language)
expect(results.stderr).to eq ""
expect(results.status).to eq 0
@@ -1271,7 +1271,7 @@ EOF
it "stores invalid positions for empty rule matches" do
write_grammar <<EOF
ast;
tree;
token a;
token bb;
@@ -1283,15 +1283,15 @@ T -> a A;
A -> bb? c?;
EOF
run_propane(language: language)
compile("spec/test_ast_invalid_positions.#{language}", language: language)
compile("spec/test_tree_invalid_positions.#{language}", language: language)
results = run_test(language: language)
expect(results.stderr).to eq ""
expect(results.status).to eq 0
end
it "allows specifying field aliases in AST mode" do
it "allows specifying field aliases in tree mode" do
write_grammar <<EOF
ast;
tree;
token a;
token b;
@@ -1303,15 +1303,15 @@ T -> b;
T -> c;
EOF
run_propane(language: language)
compile("spec/test_ast_field_aliases.#{language}", language: language)
compile("spec/test_tree_field_aliases.#{language}", language: language)
results = run_test(language: language)
expect(results.stderr).to eq ""
expect(results.status).to eq 0
end
it "aliases the correct field when multiple rules are in a rule set in AST mode" do
it "aliases the correct field when multiple rules are in a rule set in tree mode" do
write_grammar <<EOF
ast;
tree;
token a;
token b;
@@ -1326,13 +1326,13 @@ T -> b;
T -> c;
EOF
run_propane(language: language)
compile("spec/test_ast_field_aliases.#{language}", language: language)
compile("spec/test_tree_field_aliases.#{language}", language: language)
results = run_test(language: language)
expect(results.stderr).to eq ""
expect(results.status).to eq 0
end
it "allows specifying field aliases when AST mode is not enabled" do
it "allows specifying field aliases when tree mode is not enabled" do
if language == "d"
write_grammar <<EOF
<<
@@ -1378,7 +1378,7 @@ EOF
expect(results.stdout).to match /first is foo1.*second is bar2/m
end
it "aliases the correct field when multiple rules are in a rule set when AST mode is not enabled" do
it "aliases the correct field when multiple rules are in a rule set when tree mode is not enabled" do
if language == "d"
write_grammar <<EOF
<<
@@ -1430,11 +1430,11 @@ EOF
expect(results.stdout).to match /first is foo1.*second is bar2/m
end
it "does not free memory allocated for AST nodes" do
it "does not free memory allocated for tree nodes" do
ext = language == "cpp" ? "c" : language
write_grammar(File.read("spec/ast_node_memory_remains.#{ext}.propane"))
write_grammar(File.read("spec/tree_node_memory_remains.#{ext}.propane"))
run_propane(language: language)
compile("spec/test_ast_node_memory_remains.#{language}", language: language)
compile("spec/test_tree_node_memory_remains.#{language}", language: language)
results = run_test(language: language)
expect(results.stderr).to eq ""
expect(results.status).to eq 0
@@ -1460,9 +1460,9 @@ EOF
expect(results.status).to eq 0
end
it "allows multiple starting rules in AST mode" do
it "allows multiple starting rules in tree mode" do
write_grammar <<EOF
ast;
tree;
ptype int;
token a << $$ = 1; >>
token b << $$ = 2; >>
@@ -1475,14 +1475,14 @@ Bs -> b:b Bs:bs;
start Start R Bs;
EOF
run_propane(language: language)
compile("spec/test_starting_rules_ast.#{language}", language: language)
compile("spec/test_starting_rules_tree.#{language}", language: language)
results = run_test(language: language)
expect(results.stderr).to eq ""
expect(results.status).to eq 0
end
if %w[c cpp].include?(language)
it "allows a user function to free token node memory in AST mode" do
it "allows a user function to free token node memory in tree mode" do
write_grammar <<EOF
<<
static void free_token(Token * token)
@@ -1490,7 +1490,7 @@ static void free_token(Token * token)
free(token->pvalue);
}
>>
ast;
tree;
free_token_node free_token;
ptype int *;
token a <<
@@ -1504,7 +1504,7 @@ token b <<
Start -> a:a b:b;
EOF
run_propane(language: language)
compile("spec/test_free_ast_token_node_memory.#{language}", language: language)
compile("spec/test_free_tree_token_node_memory.#{language}", language: language)
results = run_test(language: language)
expect(results.stderr).to eq ""
expect(results.status).to eq 0
@@ -15,5 +15,5 @@ int main()
assert(start->b != NULL);
assert(*start->b->pvalue == 2);
p_free_ast(start);
p_free_tree(start);
}
@@ -17,7 +17,7 @@ int main()
assert(start->pR == NULL);
assert(start->r == NULL);
p_free_ast(start);
p_free_tree(start);
input = "abcd";
p_context_init(&context, (uint8_t const *)input, strlen(input));
@@ -33,7 +33,7 @@ int main()
assert(start->pR == start->r);
assert_eq(TOKEN_c, start->pR->pToken1->token);
p_free_ast(start);
p_free_tree(start);
input = "bdc";
p_context_init(&context, (uint8_t const *)input, strlen(input));
@@ -44,7 +44,7 @@ int main()
assert(start->r != NULL);
assert_eq(TOKEN_d, start->pR->pToken1->token);
p_free_ast(start);
p_free_tree(start);
return 0;
}
@@ -16,7 +16,7 @@ int main()
assert(start->pR3 == NULL);
assert(start->pR == NULL);
p_free_ast(start);
p_free_tree(start);
input = "abcd";
p_context_init(&context, (uint8_t const *)input, strlen(input));
@@ -30,7 +30,7 @@ int main()
assert(start->pR == start->pR3);
assert_eq(TOKEN_c, start->pR->pToken1->token);
p_free_ast(start);
p_free_tree(start);
input = "bdc";
p_context_init(&context, (uint8_t const *)input, strlen(input));
@@ -41,7 +41,7 @@ int main()
assert(start->pR != NULL);
assert_eq(TOKEN_d, start->pR->pToken1->token);
p_free_ast(start);
p_free_tree(start);
return 0;
}
@@ -13,7 +13,7 @@ int main()
assert(top->pToken != NULL);
assert_eq(TOKEN_hi, top->pToken->token);
p_free_ast(top);
p_free_tree(top);
return 0;
}
File renamed without changes.
@@ -15,7 +15,7 @@ int main()
assert_not_null(start->bs->bs->b);
assert_not_null(start->bs->bs->bs->b);
assert_not_null(start->bs->bs->bs->bs->b);
p_free_ast(start);
p_free_tree(start);
p_context_init(&context, (uint8_t const *)input, strlen(input));
assert(p_parse_Bs(&context) == P_SUCCESS);
@@ -24,14 +24,14 @@ int main()
assert_not_null(bs->bs->b);
assert_not_null(bs->bs->bs->b);
assert_not_null(bs->bs->bs->bs->b);
p_free_ast_Bs(bs);
p_free_tree_Bs(bs);
input = "c";
p_context_init(&context, (uint8_t const *)input, strlen(input));
assert(p_parse_R(&context) == P_SUCCESS);
R * r = p_result_R(&context);
assert_not_null(r->c);
p_free_ast_R(r);
p_free_tree_R(r);
return 0;
}
File renamed without changes.
+3 -3
View File
@@ -33,7 +33,7 @@ int main()
assert_eq(22, itemsmore->pItem->pToken1->pvalue);
assert(itemsmore->pItemsMore == NULL);
p_free_ast(start);
p_free_tree(start);
input = "";
p_context_init(&context, (uint8_t const *)input, strlen(input));
@@ -41,7 +41,7 @@ int main()
start = p_result(&context);
assert(start->pItems == NULL);
p_free_ast(start);
p_free_tree(start);
input = "2 1";
p_context_init(&context, (uint8_t const *)input, strlen(input));
@@ -55,7 +55,7 @@ int main()
assert(start->pItems->pItem->pDual->pTwo2 == NULL);
assert(start->pItems->pItem->pDual->pOne1 == NULL);
p_free_ast(start);
p_free_tree(start);
return 0;
}
File renamed without changes.
@@ -15,7 +15,7 @@ int main()
assert_eq(TOKEN_b, start->second->pToken->token);
assert_eq(TOKEN_c, start->third->pToken->token);
p_free_ast(start);
p_free_tree(start);
return 0;
}
File renamed without changes.
@@ -30,7 +30,7 @@ int main()
assert_eq(3, start->end_position.row);
assert_eq(8, start->end_position.col);
p_free_ast(start);
p_free_tree(start);
input = "a\nbb";
p_context_init(&context, (uint8_t const *)input, strlen(input));
@@ -56,7 +56,7 @@ int main()
assert_eq(2, start->end_position.row);
assert_eq(2, start->end_position.col);
p_free_ast(start);
p_free_tree(start);
input = "a\nc\nc";
p_context_init(&context, (uint8_t const *)input, strlen(input));
@@ -82,7 +82,7 @@ int main()
assert_eq(3, start->end_position.row);
assert_eq(1, start->end_position.col);
p_free_ast(start);
p_free_tree(start);
input = "a";
p_context_init(&context, (uint8_t const *)input, strlen(input));
@@ -104,7 +104,7 @@ int main()
assert_eq(1, start->end_position.row);
assert_eq(1, start->end_position.col);
p_free_ast(start);
p_free_tree(start);
return 0;
}
File renamed without changes.
@@ -412,7 +412,7 @@ int main(int argc, char * argv[])
}
free(pfds);
p_free_ast(pmod);
p_free_tree(pmod);
return 0;
}
File renamed without changes.
+3 -3
View File
@@ -33,7 +33,7 @@ int main()
assert_eq(22, itemsmore->pItem->pToken1->pvalue);
assert(itemsmore->pItemsMore == NULL);
p_free_ast(start);
p_free_tree(start);
input = "";
p_context_init(&context, (uint8_t const *)input, strlen(input));
@@ -41,7 +41,7 @@ int main()
start = p_result(&context);
assert(start->pItems == NULL);
p_free_ast(start);
p_free_tree(start);
input = "2 1";
p_context_init(&context, (uint8_t const *)input, strlen(input));
@@ -55,7 +55,7 @@ int main()
assert(start->pItems->pItem->pDual->pTwo2 == NULL);
assert(start->pItems->pItem->pDual->pOne1 == NULL);
p_free_ast(start);
p_free_tree(start);
return 0;
}
File renamed without changes.
@@ -43,7 +43,7 @@ int main()
assert_eq(1, start->end_position.row);
assert_eq(6, start->end_position.col);
p_free_ast(start);
p_free_tree(start);
input = "\n\n bb\nc\ncc\n\n a";
p_context_init(&context, (uint8_t const *)input, strlen(input));
@@ -82,7 +82,7 @@ int main()
assert_eq(7, start->end_position.row);
assert_eq(6, start->end_position.col);
p_free_ast(start);
p_free_tree(start);
return 0;
}
File renamed without changes.
@@ -1,5 +1,5 @@
ast;
ast_prefix P;
tree;
tree_prefix P;
<<header
#include <stdio.h>
@@ -1,5 +1,5 @@
ast;
ast_prefix P;
tree;
tree_prefix P;
<<
import std.bigint;