From 3db983ddc34ff516740d6e5e2c359c8779ee999c Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Sun, 30 Jan 2022 16:21:41 +0100 Subject: Adds text constant optimization, fixes spacing. --- src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 2 +- .../wyrd/v1/lang/computation/AddTextEffect.java | 4 + .../tonkadur/wyrd/v1/lang/computation/Text.java | 4 + .../wyrd/v1/optimizer/TextConstantOptimizer.java | 123 +++++++++++++++++++++ .../tonkadur/jsonexport/ComputationCompiler.java | 32 ++++-- .../tonkadur/jsonexport/InstructionCompiler.java | 2 +- .../src/tonkadur/jsonexport/Translator.java | 37 ++----- 7 files changed, 162 insertions(+), 42 deletions(-) create mode 100644 src/core/src/tonkadur/wyrd/v1/optimizer/TextConstantOptimizer.java diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 8d150e8..f21c39f 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -2874,7 +2874,6 @@ returns [List result] : computation[false] { - if (($computation.result) instanceof Newline) { follows_newline = true; @@ -2886,6 +2885,7 @@ returns [List result] just_added_space = false; + ($result).add(Constant.build_string(Origin.BASE_LANGUAGE, " ")); ($result).add(($computation.result)); } ( diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/AddTextEffect.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/AddTextEffect.java index 6eab85f..ac05336 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/AddTextEffect.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/AddTextEffect.java @@ -4,6 +4,8 @@ import java.util.List; import tonkadur.wyrd.v1.lang.type.Type; +import tonkadur.wyrd.v1.optimizer.TextConstantOptimizer; + import tonkadur.wyrd.v1.lang.meta.Computation; import tonkadur.wyrd.v1.lang.meta.ComputationVisitor; @@ -30,6 +32,8 @@ public class AddTextEffect extends Text this.effect_name = effect_name; this.effect_parameters = effect_parameters; + + TextConstantOptimizer.optimize(content); } /**** Accessors ************************************************************/ diff --git a/src/core/src/tonkadur/wyrd/v1/lang/computation/Text.java b/src/core/src/tonkadur/wyrd/v1/lang/computation/Text.java index bf0c148..5a1ffca 100644 --- a/src/core/src/tonkadur/wyrd/v1/lang/computation/Text.java +++ b/src/core/src/tonkadur/wyrd/v1/lang/computation/Text.java @@ -4,6 +4,8 @@ import java.util.List; import tonkadur.wyrd.v1.lang.type.Type; +import tonkadur.wyrd.v1.optimizer.TextConstantOptimizer; + import tonkadur.wyrd.v1.lang.meta.Computation; import tonkadur.wyrd.v1.lang.meta.ComputationVisitor; @@ -23,6 +25,8 @@ public class Text extends Computation super(Type.TEXT); this.content = content; + + TextConstantOptimizer.optimize(content); } /**** Accessors ************************************************************/ diff --git a/src/core/src/tonkadur/wyrd/v1/optimizer/TextConstantOptimizer.java b/src/core/src/tonkadur/wyrd/v1/optimizer/TextConstantOptimizer.java new file mode 100644 index 0000000..9872dad --- /dev/null +++ b/src/core/src/tonkadur/wyrd/v1/optimizer/TextConstantOptimizer.java @@ -0,0 +1,123 @@ +package tonkadur.wyrd.v1.optimizer; + +import java.util.List; + +import tonkadur.wyrd.v1.lang.type.Type; + +import tonkadur.wyrd.v1.lang.computation.Constant; +import tonkadur.wyrd.v1.lang.computation.Text; + +import tonkadur.wyrd.v1.lang.meta.Computation; + +public class TextConstantOptimizer +{ + private static String attempt_to_extract_string_constant + ( + final Computation c + ) + { + if (c instanceof Constant) + { + final Constant v; + + v = (Constant) c; + + if (v.get_type().equals(Type.STRING)) + { + return v.get_as_string(); + } + } + else if (c instanceof Text) + { + final Text t; + + t = (Text) c; + + if (t.get_content().size() == 1) + { + return attempt_to_extract_string_constant(t.get_content().get(0)); + } + } + + return null; + } + + public static void optimize (final List content) + { + int i, content_size, acc_start_i; + String accumulator; + + content_size = content.size(); + i = 0; + acc_start_i = -1; + + accumulator = ""; + + if (content.size() <= 1) + { + return; + } + + while (i < content_size) + { + final String maybe_as_string; + + maybe_as_string = attempt_to_extract_string_constant(content.get(i)); + + if (maybe_as_string == null) + { + if (acc_start_i == -1) + { + ++i; + } + else + { + content.set(acc_start_i, Constant.string_value(accumulator)); + + i--; + + while (i > acc_start_i) + { + content.remove(i); + i--; + content_size--; + } + + i++; + acc_start_i = -1; + } + } + else + { + if (acc_start_i == -1) + { + acc_start_i = i; + accumulator = ""; + } + + ++i; + accumulator += maybe_as_string; + } + } + + if (acc_start_i == -1) + { + ++i; + } + else + { + content.set(acc_start_i, Constant.string_value(accumulator)); + + i--; + + while (i > acc_start_i) + { + content.remove(i); + i--; + } + + i++; + acc_start_i = -1; + } + } +} diff --git a/src/json-export/src/tonkadur/jsonexport/ComputationCompiler.java b/src/json-export/src/tonkadur/jsonexport/ComputationCompiler.java index e9146d7..598bc2e 100644 --- a/src/json-export/src/tonkadur/jsonexport/ComputationCompiler.java +++ b/src/json-export/src/tonkadur/jsonexport/ComputationCompiler.java @@ -62,8 +62,16 @@ public class ComputationCompiler implements ComputationVisitor result = new JSONObject(); result.put("category", "cast"); - result.put("from", n.get_parent().get_type().get_name()); - result.put("to", n.get_type().get_name()); + result.put + ( + "from", + Translator.get_compiled_type_name(n.get_parent().get_type()) + ); + result.put + ( + "to", + Translator.get_compiled_type_name(n.get_type()) + ); result.put("value", cc.get_result()); } @@ -73,7 +81,7 @@ public class ComputationCompiler implements ComputationVisitor result = new JSONObject(); result.put("category", "constant"); - result.put("type", n.get_type().get_name()); + result.put("type", Translator.get_compiled_type_name(n.get_type())); result.put("value", n.get_as_string()); } @@ -93,7 +101,7 @@ public class ComputationCompiler implements ComputationVisitor result = new JSONObject(); result.put("category", "if_else"); - result.put("type", n.get_type().get_name()); + result.put("type", Translator.get_compiled_type_name(n.get_type())); result.put("condition", cond_cc.get_result()); result.put("if_true", if_true_cc.get_result()); result.put("if_false", if_false_cc.get_result()); @@ -105,7 +113,11 @@ public class ComputationCompiler implements ComputationVisitor result = new JSONObject(); result.put("category", "get_allocable_address"); - result.put("type", n.get_target_type().get_name()); + result.put + ( + "type", + Translator.get_compiled_type_name(n.get_target_type()) + ); } public void visit_newline (final Newline n) @@ -137,7 +149,7 @@ public class ComputationCompiler implements ComputationVisitor result.put("category", "operation"); result.put("operator", n.get_operator()); - result.put("type", n.get_type().get_name()); + result.put("type", Translator.get_compiled_type_name(n.get_type())); result.put("x", cc.get_result()); if (n.get_second_parameter() != null) @@ -162,7 +174,7 @@ public class ComputationCompiler implements ComputationVisitor result = new JSONObject(); result.put("category", "address"); - result.put("type", n.get_type().get_name()); + result.put("type", Translator.get_compiled_type_name(n.get_type())); result.put("value_or_target", cc.get_result()); } @@ -180,7 +192,7 @@ public class ComputationCompiler implements ComputationVisitor result = new JSONObject(); result.put("category", "relative_address"); - result.put("type", n.get_type().get_name()); + result.put("type", Translator.get_compiled_type_name(n.get_type())); result.put("target", cc.get_result()); result.put("extra", param_cc.get_result()); } @@ -221,7 +233,7 @@ public class ComputationCompiler implements ComputationVisitor result = new JSONObject(); result.put("category", "size"); - result.put("value", cc.get_result()); + result.put("target", cc.get_result()); } public void visit_extra_computation (final ExtraComputation n) @@ -261,7 +273,7 @@ public class ComputationCompiler implements ComputationVisitor result = new JSONObject(); result.put("category", "value_of"); - result.put("type", n.get_type().get_name()); + result.put("type", Translator.get_compiled_type_name(n.get_type())); result.put("target", cc.get_result()); } diff --git a/src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java b/src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java index 39a07af..95f9332 100644 --- a/src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java +++ b/src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java @@ -208,7 +208,7 @@ public class InstructionCompiler implements InstructionVisitor result.put("category", "initialize"); result.put("target", ref_cc.get_result()); - result.put("type", Translator.compile_type(n.get_type())); + result.put("type", Translator.get_compiled_type_name(n.get_type())); } public void visit_prompt_command (final PromptCommand n) diff --git a/src/json-export/src/tonkadur/jsonexport/Translator.java b/src/json-export/src/tonkadur/jsonexport/Translator.java index 6d7f60e..69c503f 100644 --- a/src/json-export/src/tonkadur/jsonexport/Translator.java +++ b/src/json-export/src/tonkadur/jsonexport/Translator.java @@ -55,7 +55,7 @@ public class Translator obj = new JSONObject(); obj.put("name", e.get_name()); - obj.put("type", compile_type(e.get_type())); + obj.put("type",get_compiled_type_name(e.get_type())); result.add(obj); } @@ -129,7 +129,7 @@ public class Translator f = new JSONObject(); f.put("name", field.getKey()); - f.put("type", compile_type(field.getValue())); + f.put("type",get_compiled_type_name(field.getValue())); fields.add(f); } @@ -166,40 +166,17 @@ public class Translator return result; } - public static JSONObject compile_type (final Type t) + public static String get_compiled_type_name (final Type t) { - final JSONObject result; - - result = new JSONObject(); - - if (t instanceof DictType) + if (t instanceof PointerType) { - result.put("category", "structure"); - result.put("name", t.get_name()); - } - else if (t instanceof PointerType) - { - result.put("category", "pointer"); - result.put - ( - "target", - compile_type(((PointerType) t).get_target_type()) - ); + return "ptr"; } else if (t instanceof MapType) { - result.put("category", "list"); - result.put - ( - "member_type", - compile_type(((MapType) t).get_member_type()) - ); - } - else - { - result.put("category", t.get_name()); + return "list"; } - return result; + return t.get_name(); } } -- cgit v1.2.3-70-g09d2