| summaryrefslogtreecommitdiff |
diff options
13 files changed, 979 insertions, 31 deletions
diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Access.java b/src/core/src/tonkadur/fate/v1/lang/computation/Access.java new file mode 100644 index 0000000..7aae4ca --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Access.java @@ -0,0 +1,142 @@ +package tonkadur.fate.v1.lang.computation; + +import java.util.Collections; +import java.util.List; + +import tonkadur.parser.Origin; + +import tonkadur.error.ErrorManager; + +import tonkadur.fate.v1.error.InvalidTypeException; +import tonkadur.fate.v1.error.UnknownDictionaryFieldException; + +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.Computation; +import tonkadur.fate.v1.lang.meta.Reference; + +import tonkadur.fate.v1.lang.type.CollectionType; +import tonkadur.fate.v1.lang.type.Type; + +public class Access extends Reference +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Reference parent; + protected final Computation index; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected Access + ( + final Origin origin, + final Reference parent, + final Type type, + final Computation index + ) + { + super(origin, type, (parent.get_name() + "." + index.toString())); + + this.parent = parent; + this.index = index; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public static Access build + ( + final Origin origin, + Reference parent, + final Computation index + ) + throws + InvalidTypeException, + UnknownDictionaryFieldException + { + Type current_type; + + current_type = parent.get_type(); + + if (current_type.get_base_type().equals(Type.REF)) + { + parent = AtReference.build(origin, parent); + current_type = parent.get_type(); + } + + if (!index.get_type().can_be_used_as(Type.INT)) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + index.get_origin(), + current_type, + Collections.singleton(Type.INT), + parent.get_name() + ) + ); + } + + if (!(current_type instanceof CollectionType)) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + origin, + current_type, + Collections.singleton(Type.LIST), + parent.get_name() + ) + ); + + current_type = Type.ANY; + } + else + { + current_type = ((CollectionType) current_type).get_content_type(); + } + + return new Access(origin, parent, current_type, index); + } + + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final ComputationVisitor cv) + throws Throwable + { + cv.visit_access(this); + } + + public Computation get_index () + { + return index; + } + + public Reference get_parent () + { + return parent; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(Access ("); + sb.append(type.get_name()); + sb.append(") "); + sb.append(name); + sb.append("."); + sb.append(index.toString()); + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java b/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java new file mode 100644 index 0000000..687be29 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/IndexOfOperator.java @@ -0,0 +1,169 @@ +package tonkadur.fate.v1.lang.computation; + +import tonkadur.error.ErrorManager; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.error.ConflictingTypeException; +import tonkadur.fate.v1.error.IncomparableTypeException; +import tonkadur.fate.v1.error.InvalidTypeException; + +import tonkadur.fate.v1.lang.type.CollectionType; +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.Computation; + +public class IndexOfOperator extends Computation +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Computation element; + protected final Computation collection; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected IndexOfOperator + ( + final Origin origin, + final Computation element, + final Computation collection + ) + { + super(origin, Type.INT); + + this.collection = collection; + this.element = element; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public static IndexOfOperator build + ( + final Origin origin, + final Computation element, + final Computation collection + ) + throws + InvalidTypeException, + ConflictingTypeException, + IncomparableTypeException + { + final Type hint; + final Type collection_type; + final CollectionType collection_true_type; + final Type collection_element_type; + + collection_type = collection.get_type(); + + if + ( + !Type.COLLECTION_TYPES.contains(collection_type.get_base_type()) + || !(collection_type instanceof CollectionType) + ) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + collection.get_origin(), + collection.get_type(), + Type.COLLECTION_TYPES + ) + ); + } + + collection_true_type = (CollectionType) collection_type; + collection_element_type = collection_true_type.get_content_type(); + + if + ( + element.get_type().can_be_used_as(collection_element_type) + || + (element.get_type().try_merging_with(collection_element_type) != null) + ) + { + return new IndexOfOperator(origin, element, collection); + } + + ErrorManager.handle + ( + new ConflictingTypeException + ( + element.get_origin(), + element.get_type(), + collection_element_type + ) + ); + + hint = + (Type) element.get_type().generate_comparable_to + ( + collection_element_type + ); + + if (hint.equals(Type.ANY)) + { + ErrorManager.handle + ( + new IncomparableTypeException + ( + element.get_origin(), + element.get_type(), + collection_element_type + ) + ); + } + + return new IndexOfOperator(origin, element, collection); + } + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final ComputationVisitor cv) + throws Throwable + { + cv.visit_index_of_operator(this); + } + + public Computation get_collection () + { + return collection; + } + + public Computation get_element () + { + return element; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append(origin.toString()); + sb.append("(IndexOfOperator"); + sb.append(System.lineSeparator()); + sb.append(System.lineSeparator()); + + sb.append("element:"); + sb.append(System.lineSeparator()); + sb.append(element.toString()); + sb.append(System.lineSeparator()); + sb.append(System.lineSeparator()); + + sb.append("collection:"); + sb.append(System.lineSeparator()); + sb.append(collection.toString()); + + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/New.java b/src/core/src/tonkadur/fate/v1/lang/computation/New.java new file mode 100644 index 0000000..83eef1f --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/New.java @@ -0,0 +1,57 @@ +package tonkadur.fate.v1.lang.computation; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.lang.type.RefType; +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.Computation; + +public class New extends Computation +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Type target_type; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public New (final Origin origin, final Type t) + { + super(origin, new RefType(origin, t, "auto generated")); + this.target_type = t; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final ComputationVisitor cv) + throws Throwable + { + cv.visit_new(this); + } + + public Type get_target_type () + { + return target_type; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append(origin.toString()); + sb.append("(New "); + sb.append(target_type.get_name()); + sb.append(") "); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java b/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java index 2950636..12b3283 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Operator.java @@ -72,7 +72,7 @@ public class Operator ); EQUALS = - new Operator("equals", 2, 0, Type.SIMPLE_BASE_TYPES, Type.BOOLEAN); + new Operator("equals", 2, 0, Type.ALL_TYPES, Type.BOOLEAN); LOWER_THAN = new Operator("<", 2, 2, Type.SIMPLE_BASE_TYPES, Type.BOOLEAN); LOWER_EQUAL_THAN = diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java b/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java new file mode 100644 index 0000000..3f22e51 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/computation/SwitchValue.java @@ -0,0 +1,225 @@ +package tonkadur.fate.v1.lang.computation; + +import java.util.List; +import java.util.Collections; + +import tonkadur.functional.Cons; + +import tonkadur.error.ErrorManager; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.error.ConflictingTypeException; +import tonkadur.fate.v1.error.IncomparableTypeException; +import tonkadur.fate.v1.error.InvalidTypeException; + +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.Computation; + +public class SwitchValue extends Computation +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Computation target; + protected final Computation default_value; + protected final List<Cons<Computation, Computation>> branches; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected SwitchValue + ( + final Origin origin, + final Type return_type, + final Computation target, + final List<Cons<Computation, Computation>> branches, + final Computation default_value + ) + { + super(origin, return_type); + + this.target = target; + this.branches = branches; + this.default_value = default_value; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public static SwitchValue build + ( + final Origin origin, + final Computation target, + final List<Cons<Computation, Computation>> branches, + final Computation default_value + ) + throws + InvalidTypeException, + ConflictingTypeException, + IncomparableTypeException + { + final Type target_type; + final Type first_type; + Type candidate_hint, hint; + + target_type = target.get_type(); + first_type = branches.get(0).get_cdr().get_type(); + hint = first_type; + + for (final Cons<Computation, Computation> entry: branches) + { + if (!entry.get_car().get_type().can_be_used_as(target_type)) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + entry.get_car().get_origin(), + entry.get_car().get_type(), + Collections.singleton(target_type) + ) + ); + } + + if (entry.get_cdr().get_type().equals(hint)) + { + continue; + } + + candidate_hint = entry.get_cdr().get_type().try_merging_with(hint); + + if (candidate_hint != null) + { + hint = candidate_hint; + + continue; + } + + ErrorManager.handle + ( + new ConflictingTypeException + ( + entry.get_cdr().get_origin(), + entry.get_cdr().get_type(), + first_type + ) + ); + + hint = (Type) hint.generate_comparable_to(entry.get_cdr().get_type()); + + if (hint.equals(Type.ANY)) + { + ErrorManager.handle + ( + new IncomparableTypeException + ( + entry.get_cdr().get_origin(), + entry.get_cdr().get_type(), + first_type + ) + ); + } + } + + if (default_value.get_type().equals(hint)) + { + return new SwitchValue(origin, hint, target, branches, default_value); + } + + candidate_hint = default_value.get_type().try_merging_with(hint); + + if (candidate_hint != null) + { + hint = candidate_hint; + + return new SwitchValue(origin, hint, target, branches, default_value); + } + + ErrorManager.handle + ( + new ConflictingTypeException + ( + default_value.get_origin(), + default_value.get_type(), + first_type + ) + ); + + hint = (Type) hint.generate_comparable_to(default_value.get_type()); + + if (hint.equals(Type.ANY)) + { + ErrorManager.handle + ( + new IncomparableTypeException + ( + default_value.get_origin(), + default_value.get_type(), + first_type + ) + ); + } + + return new SwitchValue(origin, hint, target, branches, default_value); + } + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final ComputationVisitor cv) + throws Throwable + { + cv.visit_switch_value(this); + } + + public List<Cons<Computation, Computation>> get_branches () + { + return branches; + } + + public Computation get_target () + { + return target; + } + + public Computation get_default () + { + return default_value; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append(origin.toString()); + sb.append("(SwitchValue"); + sb.append(System.lineSeparator()); + + for (final Cons<Computation, Computation> entry: branches) + { + sb.append(System.lineSeparator()); + sb.append("On value:"); + sb.append(System.lineSeparator()); + sb.append(entry.get_car().toString()); + sb.append(System.lineSeparator()); + sb.append("Return:"); + sb.append(entry.get_cdr().toString()); + sb.append(System.lineSeparator()); + } + + sb.append(System.lineSeparator()); + sb.append("default:"); + sb.append(default_value.toString()); + sb.append(System.lineSeparator()); + + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java b/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java new file mode 100644 index 0000000..b67dc42 --- /dev/null +++ b/src/core/src/tonkadur/fate/v1/lang/instruction/SwitchInstruction.java @@ -0,0 +1,135 @@ +package tonkadur.fate.v1.lang.instruction; + +import java.util.Collections; +import java.util.List; + +import tonkadur.error.ErrorManager; + +import tonkadur.functional.Cons; + +import tonkadur.parser.Origin; + +import tonkadur.fate.v1.error.InvalidTypeException; + +import tonkadur.fate.v1.lang.type.Type; + +import tonkadur.fate.v1.lang.meta.InstructionVisitor; +import tonkadur.fate.v1.lang.meta.Instruction; +import tonkadur.fate.v1.lang.meta.Computation; + +public class SwitchInstruction extends Instruction +{ + /***************************************************************************/ + /**** MEMBERS **************************************************************/ + /***************************************************************************/ + protected final Computation target; + protected final List<Cons<Computation, Instruction>> branches; + protected final Instruction default_instruction; + + /***************************************************************************/ + /**** PROTECTED ************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + protected SwitchInstruction + ( + final Origin origin, + final Computation target, + final List<Cons<Computation, Instruction>> branches, + final Instruction default_instruction + ) + { + super(origin); + + this.target = target; + this.branches = branches; + this.default_instruction = default_instruction; + } + + /***************************************************************************/ + /**** PUBLIC ***************************************************************/ + /***************************************************************************/ + /**** Constructors *********************************************************/ + public static SwitchInstruction build + ( + final Origin origin, + final Computation target, + final List<Cons<Computation, Instruction>> branches, + final Instruction default_instruction + ) + throws InvalidTypeException + { + final Type target_type; + + target_type = target.get_type(); + + for (final Cons<Computation, Instruction> branch: branches) + { + if (!branch.get_car().get_type().get_base_type().equals(target_type)) + { + ErrorManager.handle + ( + new InvalidTypeException + ( + branch.get_car().get_origin(), + branch.get_car().get_type(), + Collections.singleton(target_type) + ) + ); + } + } + + return new SwitchInstruction(origin, target, branches, default_instruction); + } + + /**** Accessors ************************************************************/ + @Override + public void get_visited_by (final InstructionVisitor iv) + throws Throwable + { + iv.visit_switch_instruction(this); + } + + public Computation get_target () + { + return target; + } + + public List<Cons<Computation, Instruction>> get_branches () + { + return branches; + } + + public Instruction get_default_instruction () + { + return default_instruction; + } + + /**** Misc. ****************************************************************/ + @Override + public String toString () + { + final StringBuilder sb = new StringBuilder(); + + sb.append("(SwitchInstruction"); + sb.append(System.lineSeparator()); + + for (final Cons<Computation, Instruction> branch: branches) + { + sb.append(System.lineSeparator()); + sb.append("case:"); + sb.append(branch.get_car().toString()); + + sb.append(System.lineSeparator()); + sb.append("then:"); + sb.append(branch.get_cdr().toString()); + } + + sb.append(System.lineSeparator()); + sb.append("default:"); + sb.append(default_instruction.toString()); + + sb.append(")"); + + return sb.toString(); + } +} diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java index 9223c7b..203289e 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/ComputationVisitor.java @@ -7,12 +7,21 @@ public interface ComputationVisitor public void visit_at_reference (final AtReference n) throws Throwable; + public void visit_access (final Access n) + throws Throwable; + + public void visit_new (final New n) + throws Throwable; + public void visit_cast (final Cast n) throws Throwable; public void visit_cond_value (final CondValue n) throws Throwable; + public void visit_switch_value (final SwitchValue n) + throws Throwable; + public void visit_constant (final Constant n) throws Throwable; @@ -28,6 +37,9 @@ public interface ComputationVisitor public void visit_is_member_operator (final IsMemberOperator n) throws Throwable; + public void visit_index_of_operator (final IndexOfOperator n) + throws Throwable; + public void visit_macro_value_call (final MacroValueCall n) throws Throwable; diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java index 5f78fc0..fc542bd 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/InstructionVisitor.java @@ -17,6 +17,9 @@ public interface InstructionVisitor public void visit_cond_instruction (final CondInstruction ci) throws Throwable; + public void visit_switch_instruction (final SwitchInstruction ci) + throws Throwable; + public void visit_display (final Display n) throws Throwable; diff --git a/src/core/src/tonkadur/fate/v1/lang/type/Type.java b/src/core/src/tonkadur/fate/v1/lang/type/Type.java index 0cf19b4..aa3e01c 100644 --- a/src/core/src/tonkadur/fate/v1/lang/type/Type.java +++ b/src/core/src/tonkadur/fate/v1/lang/type/Type.java @@ -31,6 +31,7 @@ public class Type extends DeclaredEntity public static final Type STRING; public static final Set<Type> NUMBER_TYPES; + public static final Set<Type> ALL_TYPES; public static final Set<Type> SIMPLE_BASE_TYPES; public static final Set<Type> COLLECTION_TYPES; @@ -55,6 +56,19 @@ public class Type extends DeclaredEntity SET = new Type(base, null, "set"); STRING = new Type(base, null, "string"); + ALL_TYPES = new HashSet<Type>(); + ALL_TYPES.add(ANY); + ALL_TYPES.add(BOOLEAN); + ALL_TYPES.add(DICT); + ALL_TYPES.add(FLOAT); + ALL_TYPES.add(INT); + ALL_TYPES.add(LIST); + ALL_TYPES.add(REF); + ALL_TYPES.add(RICH_TEXT); + ALL_TYPES.add(SET); + ALL_TYPES.add(STRING); + + NUMBER_TYPES = new HashSet<Type>(); NUMBER_TYPES.add(FLOAT); NUMBER_TYPES.add(INT); diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 index 6c12fa4..db257bf 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 @@ -6,6 +6,7 @@ lexer grammar FateLexer; } fragment SEP: [ \t\r\n]+; +fragment US: '_'?; WS: SEP; @@ -13,6 +14,7 @@ L_PAREN: '('; R_PAREN: ')'; +ACCESS_KW: L_PAREN 'access' SEP+; ADD_KW: L_PAREN 'add' SEP+; AND_KW: L_PAREN ('and'|'/\\') SEP+; ASSERT_KW: L_PAREN 'assert' SEP+; @@ -21,19 +23,20 @@ CAST_KW: L_PAREN 'cast' SEP+; CLEAR_KW: L_PAREN 'clear' SEP+; COND_KW: L_PAREN 'cond' SEP+; COUNT_KW: L_PAREN 'count' SEP+; -DECLARE_ALIAS_TYPE_KW: L_PAREN ((('declare'|'define'|'def')'_'('sub'('_'?))?'type')|'typedef') SEP+; -DECLARE_DICT_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_dict_type' SEP+; -DECLARE_EVENT_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_event_type' SEP+; -DECLARE_LIST_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_list_type' SEP+; -DECLARE_REF_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_ref_type' SEP+; -DECLARE_SET_TYPE_KW: L_PAREN ('declare'|'define'|'def')'_set_type' SEP+; -DECLARE_TEXT_EFFECT_KW: L_PAREN ('declare'|'define'|'def')'_text_effect' SEP+; -DECLARE_VARIABLE_KW: L_PAREN ('declare'|'define'|'def')'_var'('iable')? SEP+; -DEFINE_MACRO_KW: L_PAREN ('declare'|'define'|'def')'_macro' SEP+; -DEFINE_SEQUENCE_KW: L_PAREN ('declare'|'define'|'def')'_sequence' SEP+; -DELETE_KW: L_PAREN 'delete' SEP+; +DECLARE_ALIAS_TYPE_KW: + L_PAREN ((('declare'|'define'|'def')US('sub'US)?'type')|'typedef') SEP+; +DECLARE_DICT_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'dict'(US'type')? SEP+; +DECLARE_EVENT_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'event'(US'type')? SEP+; +DECLARE_LIST_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'list'(US'type')? SEP+; +DECLARE_REF_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'ref'(US'type')? SEP+; +DECLARE_SET_TYPE_KW: L_PAREN ('declare'|'define'|'def')US'set'(US'type')? SEP+; +DECLARE_TEXT_EFFECT_KW: L_PAREN ('declare'|'define'|'def')US'text'US'effect' SEP+; +DECLARE_VARIABLE_KW: L_PAREN ('declare'|'define'|'def')US'var'('iable')? SEP+; +DEFINE_MACRO_KW: L_PAREN ('declare'|'define'|'def')US'macro' SEP+; +DEFINE_SEQUENCE_KW: L_PAREN ('declare'|'define'|'def')US'seq'('uence')? SEP+; DIVIDE_KW: L_PAREN ('divide'|'/'|'div') SEP+; -ENABLE_TEXT_EFFECT_KW: L_PAREN 'text_effect' SEP+; +DO_WHILE_KW: L_PAREN ('do'US'while') SEP+; +ENABLE_TEXT_EFFECT_KW: L_PAREN 'text'US'effect' SEP+; END_KW: L_PAREN 'end)'; EQUALS_KW: L_PAREN ('equals'|'='|'=='|'eq') SEP+; EVENT_KW: L_PAREN 'event' SEP+; @@ -41,42 +44,50 @@ EXTENSION_FIRST_LEVEL_KW: L_PAREN '@'; EXTENSION_INSTRUCTION_KW: L_PAREN '#'; EXTENSION_VALUE_KW: L_PAREN '$'; FALSE_KW: L_PAREN 'false)'; -FATE_VERSION_KW: L_PAREN 'fate_version' SEP+; +FATE_VERSION_KW: L_PAREN 'fate'US'version' SEP+; FIELD_KW: L_PAREN 'field' SEP+; -GREATER_EQUAL_THAN_KW: L_PAREN ('greater_equal_than'|'>='|'ge') SEP+; -GREATER_THAN_KW: L_PAREN ('greater_than'|'>'|'gt') SEP+; -IF_ELSE_KW: L_PAREN ('if_else'|'ifelse') SEP+; +FOR_EACH_KW: L_PAREN ('for'US'each') SEP+; +FOR_KW: L_PAREN 'for' SEP+; +FREE_KW: L_PAREN ('free'|'release'|'destroy') SEP+; +GREATER_EQUAL_THAN_KW: L_PAREN ('greater'US'equal'US'than'|'>='|'ge') SEP+; +GREATER_THAN_KW: L_PAREN ('greater'US'than'|'>'|'gt') SEP+; +IF_ELSE_KW: L_PAREN ('if'US'else') SEP+; IF_KW: L_PAREN 'if' SEP+; IMACRO_KW: L_PAREN 'macro' SEP+; -IMPLIES_KW: L_PAREN ('implies'|'=>') SEP+; +IMPLIES_KW: L_PAREN ('implies'|'=>'|'->') SEP+; INCLUDE_KW: L_PAREN 'include' SEP+; -IS_MEMBER_KW: L_PAREN ('is_member'|'contains') SEP+; -LOWER_EQUAL_THAN_KW: L_PAREN ('lower_equal_than'|'=<'|'<='|'le') SEP+; -LOWER_THAN_KW: L_PAREN ('lower_than'|'<'|'lt') SEP+; +INDEX_OF_KW: L_PAREN ('index'US'of') SEP+; +IS_MEMBER_KW: L_PAREN ('is'US'member'|'contains'|'has') SEP+; +LOWER_EQUAL_THAN_KW: L_PAREN ('lower'US'equal'US'than'|'=<'|'<='|'le') SEP+; +LOWER_THAN_KW: L_PAREN ('lower'US'than'|'<'|'lt') SEP+; MINUS_KW: L_PAREN ('minus'|'-') SEP+; +MODULO_KW: L_PAREN ('modulo'|'%'|'mod') SEP+; NEWLINE_KW: L_PAREN 'newline)'; -NEW_KW: L_PAREN 'new' SEP+; +NEW_KW: L_PAREN ('new'|'reserve'|'create') SEP+; NOT_KW: L_PAREN ('not'|'~'|'!') SEP+; -ONE_IN_KW: L_PAREN 'one_in' SEP+; +ONE_IN_KW: L_PAREN 'one'US'in' SEP+; OR_KW: L_PAREN ('or'|'\\/') SEP+; PARAMETER_KW: L_PAREN ('param'|'parameter'|'par') SEP+; -PLAYER_CHOICE_KW: L_PAREN ('choice'|'user_choice'|'player_choice') SEP+; +PLAYER_CHOICE_KW: L_PAREN ('choice'|'user'US'choice'|'player'US'choice') SEP+; PLUS_KW: L_PAREN ('plus'|'+') SEP+; -POWER_KW: L_PAREN ('power'|'^'|'**') SEP+; -RANDOM_KW: L_PAREN ('random'|'rand') SEP+; +POWER_KW: L_PAREN ('power'|'^'|'**'|'pow') SEP+; +RANDOM_KW: L_PAREN ('random'|'rand'|'rnd') SEP+; REF_KW: L_PAREN 'ref' SEP+; -REMOVE_ALL_KW: L_PAREN 'remove_all' SEP+; -REMOVE_ONE_KW: L_PAREN 'remove_one' SEP+; -REQUIRE_EXTENSION_KW: L_PAREN 'require_extension' SEP+; +REMOVE_ALL_KW: L_PAREN 'remove'US'all' SEP+; +REMOVE_ONE_KW: L_PAREN 'remove'US'one' SEP+; +REMOVE_AT_KW: L_PAREN ('remove'US'at'|'rm'|'del'|'delete') SEP+; +REQUIRE_EXTENSION_KW: L_PAREN 'require'US'extension' SEP+; REQUIRE_KW: L_PAREN 'require' SEP+; -SEQUENCE_KW: L_PAREN 'sequence' SEP+; -SET_FIELDS_KW: L_PAREN 'set_fields' SEP+; +SEQUENCE_KW: L_PAREN 'seq'('uence')? SEP+; +SET_FIELDS_KW: L_PAREN 'set'US'fields' SEP+; SET_KW: L_PAREN 'set' SEP+; +SWITCH_KW: L_PAREN 'switch' SEP+; TIMES_KW: L_PAREN ('times'|'*') SEP+; TRUE_KW: L_PAREN 'true)'; VAL_KW: L_PAREN ('val'|'value') SEP+; VARIABLE_KW: L_PAREN ('variable'|'var') SEP+; VMACRO_KW: L_PAREN 'vmacro' SEP+; +WHILE_KW: L_PAREN 'while' SEP+; WORD: (~([ \t\r\n()])|'\\)'|'\\(')+; diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index b77ad98..cd8ca3a 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -602,6 +602,23 @@ returns [Instruction result] ); } + | REMOVE_AT_KW value WS+ value_reference WS* R_PAREN + { + $result = null; + /* + RemoveElementAt.build + ( + CONTEXT.get_origin_at + ( + ($REMOVE_AT_KW.getLine()), + ($REMOVE_AT_KW.getCharPositionInLine()) + ), + ($value.result), + ($value_reference.result) + ); + */ + } + | REMOVE_ALL_KW value WS+ value_reference WS* R_PAREN { $result = @@ -646,6 +663,12 @@ returns [Instruction result] ); } + | FREE_KW value_reference WS* R_PAREN + { + /* TODO */ + $result = null; + } + | SET_FIELDS_KW value_reference WS* field_value_list WS* R_PAREN { final Origin origin; @@ -685,6 +708,30 @@ returns [Instruction result] $result = new InstructionList(origin, operations); } + | WHILE_KW value WS* general_fate_sequence WS* R_PAREN + { + /* TODO */ + $result = null; + } + + | DO_WHILE_KW value WS* general_fate_sequence WS* R_PAREN + { + /* TODO */ + $result = null; + } + + | FOR_KW general_fate_instr WS * value WS* general_fate_instr WS* general_fate_sequence WS* R_PAREN + { + /* TODO */ + $result = null; + } + + | FOR_EACH_KW value_reference WS+ WORD WS+ general_fate_sequence WS* R_PAREN + { + /* TODO */ + $result = null; + } + | EVENT_KW WORD WS+ value_list WS* R_PAREN { final Origin origin; @@ -836,6 +883,22 @@ returns [Instruction result] ); } + | SWITCH_KW value WS* instr_cond_list WS* general_fate_instr WS *R_PAREN + { + $result = + SwitchInstruction.build + ( + CONTEXT.get_origin_at + ( + ($SWITCH_KW.getLine()), + ($SWITCH_KW.getCharPositionInLine()) + ), + ($value.result), + ($instr_cond_list.result), + ($general_fate_instr.result) + ); + } + | PLAYER_CHOICE_KW player_choice_list WS* R_PAREN { $result = @@ -1621,6 +1684,27 @@ returns [Computation result]: ($value_reference.result) ); } + + | INDEX_OF_KW value WS+ value_reference WS* R_PAREN + { + $result = + IndexOfOperator.build + ( + CONTEXT.get_origin_at + ( + ($INDEX_OF_KW.getLine()), + ($INDEX_OF_KW.getCharPositionInLine()) + ), + ($value.result), + ($value_reference.result) + ); + } + + | NEW_KW WORD WS* R_PAREN + { + /* TODO */ + $result = null; + } ; catch [final Throwable e] { @@ -1666,6 +1750,21 @@ returns [Computation result]: ); } + | MODULO_KW value_list WS* R_PAREN + { + $result = + Operation.build + ( + CONTEXT.get_origin_at + ( + ($MODULO_KW.getLine()), + ($MODULO_KW.getCharPositionInLine()) + ), + Operator.MODULO, + ($value_list.result) + ); + } + | TIMES_KW value_list WS* R_PAREN { $result = @@ -1902,6 +2001,22 @@ returns [Computation result] ); } + | SWITCH_KW target=value WS* value_cond_list WS* default_val=value WS* R_PAREN + { + $result = + SwitchValue.build + ( + CONTEXT.get_origin_at + ( + ($SWITCH_KW.getLine()), + ($SWITCH_KW.getCharPositionInLine()) + ), + ($target.result), + ($value_cond_list.result), + ($default_val.result) + ); + } + | boolean_expression { $result = ($boolean_expression.result); @@ -2060,6 +2175,21 @@ returns [Reference result] ); } + | ACCESS_KW value_reference value R_PAREN + { + $result = + Access.build + ( + CONTEXT.get_origin_at + ( + ($ACCESS_KW.getLine()), + ($ACCESS_KW.getCharPositionInLine()) + ), + ($value_reference.result), + ($value.result) + ); + } + | VARIABLE_KW WORD WS* R_PAREN { final Origin target_var_origin; diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java index 4766e73..dd3e707 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/ComputationCompiler.java @@ -960,6 +960,46 @@ implements tonkadur.fate.v1.lang.meta.ComputationVisitor } @Override + public void visit_index_of_operator + ( + final tonkadur.fate.v1.lang.computation.IndexOfOperator n + ) + throws Throwable + { + /* TODO */ + } + + @Override + public void visit_new + ( + final tonkadur.fate.v1.lang.computation.New n + ) + throws Throwable + { + /* TODO */ + } + + @Override + public void visit_access + ( + final tonkadur.fate.v1.lang.computation.Access n + ) + throws Throwable + { + /* TODO */ + } + + @Override + public void visit_switch_value + ( + final tonkadur.fate.v1.lang.computation.SwitchValue n + ) + throws Throwable + { + /* TODO */ + } + + @Override public void visit_paragraph ( final tonkadur.fate.v1.lang.computation.Paragraph n diff --git a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java index d0b3711..5277fd3 100644 --- a/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java +++ b/src/core/src/tonkadur/wyrd/v1/compiler/fate/v1/InstructionCompiler.java @@ -333,6 +333,16 @@ implements tonkadur.fate.v1.lang.meta.InstructionVisitor } @Override + public void visit_switch_instruction + ( + final tonkadur.fate.v1.lang.instruction.SwitchInstruction ci + ) + throws Throwable + { + /* TODO */ + } + + @Override public void visit_cond_instruction ( final tonkadur.fate.v1.lang.instruction.CondInstruction ci |


