summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-07-05 20:01:20 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-07-05 20:01:20 +0200
commita433b570a340d5c0bf70e6452f68f60d2b241032 (patch)
treec8493d19165dd3a89d51e408c64ec40126b8c94b
parent3803f236f97b9149ddead5218c3585097245c600 (diff)
Adds if/else value node.
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/IfElseValue.java141
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g416
2 files changed, 154 insertions, 3 deletions
diff --git a/src/core/src/tonkadur/fate/v1/lang/IfElseValue.java b/src/core/src/tonkadur/fate/v1/lang/IfElseValue.java
new file mode 100644
index 0000000..960af57
--- /dev/null
+++ b/src/core/src/tonkadur/fate/v1/lang/IfElseValue.java
@@ -0,0 +1,141 @@
+package tonkadur.fate.v1.lang;
+
+import java.util.Set;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Collections;
+
+import tonkadur.error.ErrorManager;
+
+import tonkadur.parser.Origin;
+
+import tonkadur.fate.v1.lang.meta.ValueNode;
+
+import tonkadur.fate.v1.error.ConflictingTypeException;
+import tonkadur.fate.v1.error.IncomparableTypeException;
+import tonkadur.fate.v1.error.InvalidTypeException;
+
+public class IfElseValue extends ValueNode
+{
+ /***************************************************************************/
+ /**** MEMBERS **************************************************************/
+ /***************************************************************************/
+ protected final ValueNode condition;
+ protected final ValueNode if_true;
+ protected final ValueNode if_false;
+
+ /***************************************************************************/
+ /**** PROTECTED ************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ protected IfElseValue
+ (
+ final Origin origin,
+ final Type return_type,
+ final ValueNode condition,
+ final ValueNode if_true,
+ final ValueNode if_false
+ )
+ {
+ super(origin, return_type);
+
+ this.condition = condition;
+ this.if_true = if_true;
+ this.if_false = if_false;
+ }
+
+ /***************************************************************************/
+ /**** PUBLIC ***************************************************************/
+ /***************************************************************************/
+ /**** Constructors *********************************************************/
+ public static IfElseValue build
+ (
+ final Origin origin,
+ final ValueNode condition,
+ final ValueNode if_true,
+ final ValueNode if_false
+ )
+ throws
+ InvalidTypeException,
+ ConflictingTypeException,
+ IncomparableTypeException
+ {
+ final Type hint;
+ final Type if_true_type;
+ final Type if_false_type;
+
+ if (!condition.get_type().can_be_used_as(Type.BOOLEAN))
+ {
+ ErrorManager.handle
+ (
+ new InvalidTypeException
+ (
+ origin,
+ condition.get_type(),
+ Collections.singleton(Type.BOOLEAN)
+ )
+ );
+ }
+
+ if_true_type = if_true.get_type();
+ if_false_type = if_false.get_type();
+
+ if (if_true_type.equals(if_false_type))
+ {
+ return
+ new IfElseValue(origin, if_true_type, condition, if_true, if_false);
+ }
+
+ ErrorManager.handle
+ (
+ new ConflictingTypeException(origin, if_false_type, if_true_type)
+ );
+
+ hint =
+ (Type) if_false_type.generate_comparable_to(if_true_type);
+
+ if (hint.equals(Type.ANY))
+ {
+ ErrorManager.handle
+ (
+ new IncomparableTypeException(origin, if_false_type, if_true_type)
+ );
+ }
+
+ return new IfElseValue(origin, hint, condition, if_true, if_false);
+ }
+
+ /**** Accessors ************************************************************/
+
+ /**** Misc. ****************************************************************/
+ @Override
+ public String toString ()
+ {
+ final StringBuilder sb = new StringBuilder();
+
+ sb.append(origin.toString());
+ sb.append("(IfElseValue");
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+
+ sb.append("Condition:");
+ sb.append(System.lineSeparator());
+ sb.append(condition.toString());
+
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+ sb.append("If true:");
+ sb.append(System.lineSeparator());
+ sb.append(if_true.toString());
+
+ sb.append(System.lineSeparator());
+ sb.append(System.lineSeparator());
+ sb.append("If false:");
+ sb.append(System.lineSeparator());
+ sb.append(if_false.toString());
+
+ sb.append(")");
+
+ return sb.toString();
+ }
+}
diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
index 2585948..27ff773 100644
--- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
+++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4
@@ -654,10 +654,20 @@ returns [ValueNode result]
non_text_value
returns [ValueNode result]
:
- IF_ELSE_KW value WS+ value WS+ value R_PAREN
+ IF_ELSE_KW cond=value WS+ if_true=value WS+ if_false=value R_PAREN
{
- /* TODO */
- $result = null;
+ $result =
+ IfElseValue.build
+ (
+ CONTEXT.get_origin_at
+ (
+ ($IF_ELSE_KW.getLine()),
+ ($IF_ELSE_KW.getCharPositionInLine())
+ ),
+ ($cond.result),
+ ($if_true.result),
+ ($if_false.result)
+ );
}
| COND_KW value_cond_list R_PAREN