| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2022-01-30 16:21:41 +0100 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2022-01-30 16:21:41 +0100 |
| commit | 3db983ddc34ff516740d6e5e2c359c8779ee999c (patch) | |
| tree | ea1426992ca9ec1d24e71122ab7bad175372ad69 /src/core | |
| parent | b748936e7ec1e39b664b6933c66912e77d570f99 (diff) | |
Adds text constant optimization, fixes spacing.
Diffstat (limited to 'src/core')
4 files changed, 132 insertions, 1 deletions
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<Computation> result] : computation[false] { - if (($computation.result) instanceof Newline) { follows_newline = true; @@ -2886,6 +2885,7 @@ returns [List<Computation> 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<Computation> 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; + } + } +} |


