summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
-rw-r--r--src/json-export/src/tonkadur/jsonexport/ComputationCompiler.java32
-rw-r--r--src/json-export/src/tonkadur/jsonexport/InstructionCompiler.java2
-rw-r--r--src/json-export/src/tonkadur/jsonexport/Translator.java37
7 files changed, 162 insertions, 42 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;
+ }
+ }
+}
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();
}
}