summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g42
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/AddTextEffect.java4
-rw-r--r--src/core/src/tonkadur/wyrd/v1/lang/computation/Text.java4
-rw-r--r--src/core/src/tonkadur/wyrd/v1/optimizer/TextConstantOptimizer.java123
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;
+ }
+ }
+}