| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java | 9 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/meta/VariableFromWord.java | 4 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/type/ExtraType.java | 43 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 92 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/ParserData.java (renamed from src/core/src/tonkadur/fate/v1/parser/Parser.java) | 17 | 
5 files changed, 103 insertions, 62 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java b/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java index 26b08b4..f2959b2 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java @@ -5,6 +5,7 @@ import java.util.List;  import tonkadur.parser.Origin;  import tonkadur.fate.v1.lang.meta.ComputationVisitor; +import tonkadur.fate.v1.lang.meta.Computation;  import tonkadur.fate.v1.lang.meta.TextNode;  public class Paragraph extends TextNode @@ -12,7 +13,7 @@ public class Paragraph extends TextNode     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ -   protected final List<TextNode> content; +   protected final List<Computation> content;     /***************************************************************************/     /**** PROTECTED ************************************************************/ @@ -26,7 +27,7 @@ public class Paragraph extends TextNode     public Paragraph     (        final Origin origin, -      final List<TextNode> content +      final List<Computation> content     )     {        super(origin); @@ -42,7 +43,7 @@ public class Paragraph extends TextNode        cv.visit_paragraph(this);     } -   public List<TextNode> get_content () +   public List<Computation> get_content ()     {        return content;     } @@ -55,7 +56,7 @@ public class Paragraph extends TextNode        sb.append("(Paragraph "); -      for (final TextNode text: content) +      for (final Computation text: content)        {           sb.append(content.toString());        } diff --git a/src/core/src/tonkadur/fate/v1/lang/meta/VariableFromWord.java b/src/core/src/tonkadur/fate/v1/lang/meta/VariableFromWord.java index b6c933e..365e70a 100644 --- a/src/core/src/tonkadur/fate/v1/lang/meta/VariableFromWord.java +++ b/src/core/src/tonkadur/fate/v1/lang/meta/VariableFromWord.java @@ -10,7 +10,7 @@ import java.util.ArrayList;  import tonkadur.parser.Origin;  import tonkadur.parser.ParsingError; -import tonkadur.fate.v1.parser.Parser; +import tonkadur.fate.v1.parser.ParserData;  import tonkadur.fate.v1.lang.Variable;  import tonkadur.fate.v1.lang.computation.Constant; @@ -29,7 +29,7 @@ public class VariableFromWord     public static Computation generate     ( -      final Parser parser, +      final ParserData parser,        final Origin origin,        final String word     ) diff --git a/src/core/src/tonkadur/fate/v1/lang/type/ExtraType.java b/src/core/src/tonkadur/fate/v1/lang/type/ExtraType.java index 8c48380..91543fc 100644 --- a/src/core/src/tonkadur/fate/v1/lang/type/ExtraType.java +++ b/src/core/src/tonkadur/fate/v1/lang/type/ExtraType.java @@ -1,15 +1,18 @@  package tonkadur.fate.v1.lang.type; +import java.util.List; +  import tonkadur.parser.Origin;  import tonkadur.fate.v1.lang.meta.DeclaredEntity; +import tonkadur.fate.v1.lang.meta.RecurrentChecks;  public class ExtraType extends Type  {     /***************************************************************************/     /**** MEMBERS **************************************************************/     /***************************************************************************/ - +   protected final List<Type> parameters;     /***************************************************************************/     /**** PUBLIC ***************************************************************/     /***************************************************************************/ @@ -18,20 +21,26 @@ public class ExtraType extends Type     public ExtraType     (        final Origin origin, -      final String name +      final String name, +      final List<Type> parameters     )     {        super(origin, null, name); + +      this.parameters = parameters;     }     public ExtraType     (        final Origin origin,        final ExtraType parent, -      final String name +      final String name, +      final List<Type> parameters     )     {        super(origin, parent, name); + +      this.parameters = parameters;     }     /**** Accessors ************************************************************/ @@ -46,7 +55,24 @@ public class ExtraType extends Type           e = (ExtraType) t; -         return get_base_type().get_name().equals(e.get_base_type().get_name()); +         if (get_base_type().get_name().equals(e.get_base_type().get_name())) +         { +            try +            { +               RecurrentChecks.assert_types_matches_signature +               ( +                  Origin.BASE_LANGUAGE, +                  parameters, +                  e.parameters +               ); +            } +            catch (final Throwable _e) +            { +               return false; +            } + +            return true; +         }        } @@ -76,7 +102,7 @@ public class ExtraType extends Type     @Override     public Type generate_alias (final Origin origin, final String name)     { -      return new ExtraType(origin, this, name); +      return new ExtraType(origin, this, name, parameters);     }     @Override @@ -87,6 +113,13 @@ public class ExtraType extends Type        sb.append("ExtraType::");        sb.append(name); +      for (final Type t: parameters) +      { +         sb.append("<"); +         sb.append(t.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 d211d03..a8a5d06 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -46,13 +46,13 @@ options  @members  { -   Parser PARSER; +   ParserData PARSER;  }  /******************************************************************************/  /******************************************************************************/  /******************************************************************************/ -fate_file [Parser PARSER] +fate_file [ParserData parser]  @init  {     PARSER = parser; @@ -99,7 +99,7 @@ returns [List<Instruction> result]  first_level_instruction  @init  { -   Parser.LocalVariables previous_local_variables_stack; +   ParserData.LocalVariables previous_local_variables_stack;  }  :     DECLARE_ALIAS_TYPE_KW parent=type WS+ identifier WS* R_PAREN @@ -326,7 +326,7 @@ first_level_instruction           {              previous_local_variables_stack = PARSER.get_local_variables_stack();              PARSER.discard_local_variables_stack(); -            PARSER.increase_local_variables_herarchy(); +            PARSER.increase_local_variables_hierarchy();           }           identifier           WS* @@ -334,7 +334,7 @@ first_level_instruction              L_PAREN WS* variable_list WS* R_PAREN              {                 PARSER.add_local_variables(($variable_list.result).as_map()); -               PARSER.increase_local_variables_herarchy(); +               PARSER.increase_local_variables_hierarchy();              }           )           pre_sequence_point=WS+ @@ -400,7 +400,7 @@ first_level_instruction        {           PARSER.add_file_content           ( -            PARSER.get_location_at +            PARSER.get_origin_at              (                 ($REQUIRE_KW.getLine()),                 ($REQUIRE_KW.getCharPositionInLine()) @@ -418,7 +418,7 @@ first_level_instruction        PARSER.add_file_content        ( -         PARSER.get_location_at +         PARSER.get_origin_at           (              ($INCLUDE_KW.getLine()),              ($INCLUDE_KW.getCharPositionInLine()) @@ -818,11 +818,11 @@ returns [Instruction result]              ($field_value_list.result)        )        { -         final FieldReference fr; +         final FieldAccess fa;           final Computation cp; -         fr = -            FieldReference.build +         fa = +            FieldAccess.build              (                 entry.get_car(),                 ($computation.result), @@ -831,9 +831,9 @@ returns [Instruction result]           cp = entry.get_cdr().get_cdr(); -         RecurrentChecks.assert_can_be_used_as(cp, fr.get_type()); +         RecurrentChecks.assert_can_be_used_as(cp, fa.get_type()); -         assignments.add(new Cons(fr.get_field_name(), cp)); +         assignments.add(new Cons(fa.get_field_name(), cp));        }        $result = @@ -854,7 +854,7 @@ returns [Instruction result]  /******************************************************************************/     | PLAYER_CHOICE_KW -         player_choice_list[Parser.generate_player_choice_data()] +         player_choice_list[PARSER.generate_player_choice_data()]           WS*        R_PAREN     { @@ -1033,7 +1033,7 @@ returns [List<Cons<Computation, Instruction>> result]     }  ; -player_choice_list [Parser.PlayerChoiceData pcd] +player_choice_list [ParserData.PlayerChoiceData pcd]  returns [List<Instruction> result]  @init  { @@ -1052,7 +1052,7 @@ catch [final Throwable e]     PARSER.handle_error(e);  } -maybe_player_choice_list [Parser.PlayerChoiceData pcd] +maybe_player_choice_list [ParserData.PlayerChoiceData pcd]  returns [List<Instruction> result]  @init  { @@ -1069,7 +1069,7 @@ returns [List<Instruction> result]     }  ; -player_choice [Parser.PlayerChoiceData pcd] +player_choice [ParserData.PlayerChoiceData pcd]  returns [Instruction result]  /*   * Do not use a separate Local Variable stack for the player choice @@ -1080,7 +1080,7 @@ returns [Instruction result]     TEXT_OPTION_KW        L_PAREN WS*        { -         PARSER.enable_restricted_stack_of(pcd); +         PARSER.enable_restricted_variable_stack_of(pcd);        }        paragraph        WS* R_PAREN WS* @@ -1108,7 +1108,7 @@ returns [Instruction result]     | EVENT_OPTION_KW        { -         PARSER.enable_restricted_stack_of(pcd); +         PARSER.enable_restricted_variable_stack_of(pcd);        }        L_PAREN WS* WORD maybe_computation_list WS* R_PAREN WS*        { @@ -1158,7 +1158,7 @@ returns [Instruction result]     | IF_KW           { -            PARSER.enable_restricted_stack_of(pcd); +            PARSER.enable_restricted_variable_stack_of(pcd);           }           computation WS*           { @@ -1182,7 +1182,7 @@ returns [Instruction result]     | IF_ELSE_KW           { -            PARSER.enable_restricted_stack_of(pcd); +            PARSER.enable_restricted_variable_stack_of(pcd);           }           computation WS*           { @@ -1222,7 +1222,7 @@ returns [Instruction result]     | SWITCH_KW           { -            PARSER.enable_restricted_stack_of(pcd); +            PARSER.enable_restricted_variable_stack_of(pcd);           }           computation WS*           { @@ -1249,7 +1249,7 @@ returns [Instruction result]     | FOR_KW           l0=L_PAREN           { -            PARSER.enable_restricted_stack_of(pcd); +            PARSER.enable_restricted_variable_stack_of(pcd);              PARSER.increase_local_variables_hierarchy();              pcd.increase_variable_names_hierarchy();           } @@ -1266,7 +1266,7 @@ returns [Instruction result]        R_PAREN     {        pcd.decrease_variable_names_hierarchy(); -      PARSER.enable_restricted_stack_of(pcd); +      PARSER.enable_restricted_variable_stack_of(pcd);        PARSER.decrease_local_variables_hierarchy();        PARSER.disable_restricted_stack_of(pcd); @@ -1303,7 +1303,7 @@ returns [Instruction result]     | FOR_EACH_KW           { -            PARSER.enable_restricted_stack_of(pcd); +            PARSER.enable_restricted_variable_stack_of(pcd);              PARSER.increase_local_variables_hierarchy();           }           computation WS+ @@ -1363,7 +1363,7 @@ returns [Instruction result]        player_choice_list[pcd] WS*     R_PAREN     { -      PARSER.enable_restricted_stack_of(pcd); +      PARSER.enable_restricted_variable_stack_of(pcd);        PARSER.decrease_local_variables_hierarchy();        PARSER.disable_restricted_stack_of(pcd);        $result = @@ -1385,7 +1385,7 @@ catch [final Throwable e]     PARSER.handle_error(e);  } -player_choice_cond_list [Parser.PlayerChoiceData pcd] +player_choice_cond_list [ParserData.PlayerChoiceData pcd]  returns [List<Cons<Computation, Instruction>> result]  @init  { @@ -1394,7 +1394,7 @@ returns [List<Cons<Computation, Instruction>> result]     condition = null;     $result = new ArrayList<Cons<Computation, Instruction>>(); -   PARSER.enable_restricted_stack_of(pcd); +   PARSER.enable_restricted_variable_stack_of(pcd);  }  :     ( @@ -1441,12 +1441,12 @@ catch [final Throwable e]     PARSER.handle_error(e);  } -player_choice_switch_list [Parser.PlayerChoiceData pcd] +player_choice_switch_list [ParserData.PlayerChoiceData pcd]  returns [List<Cons<Computation, Instruction>> result]  @init  {     $result = new ArrayList<Cons<Computation, Instruction>>(); -   PARSER.enable_restricted_stack_of(pcd); +   PARSER.enable_restricted_variable_stack_of(pcd);  }  :     ( @@ -1471,17 +1471,21 @@ catch [final Throwable e]  }  paragraph -returns [TextNode result] +returns [Computation result]  @init  { -   final List<TextNode> content = new ArrayList();  }  :     computation_list     {        // convert all computations to text.        // return text node. -      return new Paragraph(computation_list.result); +      return +         new Paragraph +         ( +            $computation_list.result.get(0).get_origin(), +            $computation_list.result +         );     }  ;  catch [final Throwable e] @@ -1557,7 +1561,7 @@ returns [Type result]              ($identifier.result)           ); -      $result = t.build(type_list); +      $result = t.build($type_list.result);     }  ;  catch [final Throwable e] @@ -1648,7 +1652,7 @@ returns [List<Cons<Variable, Computation>> result]                 false              ); -         PARSER.add_context_variable(v); +         PARSER.add_local_variable(v);           $result.add(new Cons(v, ($computation.result)));        } @@ -1661,7 +1665,7 @@ catch [final Throwable e]     PARSER.handle_error(e);  } -choice_for_update_variable_list [Parser.PlayerChoiceData pcd] +choice_for_update_variable_list [ParserData.PlayerChoiceData pcd]  returns [List<Instruction> result]  @init  { @@ -1737,7 +1741,7 @@ catch [final Throwable e]     PARSER.handle_error(e);  } -choice_for_variable_list [Parser.PlayerChoiceData pcd] +choice_for_variable_list [ParserData.PlayerChoiceData pcd]  returns [List<Instruction> result]  @init  { @@ -1794,7 +1798,7 @@ returns [List<Instruction> result]           $result.add(new LocalVariable(new_var)); -         PARSER.add_context_variable(v); +         PARSER.add_local_variable(new_var);           $result.add           ( @@ -1974,7 +1978,7 @@ computation  returns [Computation result]  @init  { -   Parser.LocalVariables previous_local_variables_stack; +   ParserData.LocalVariables previous_local_variables_stack;  }  :     WORD @@ -1997,7 +2001,7 @@ returns [Computation result]           VariableFromWord.generate           (              PARSER, -            CONTEXT.get_origin_at +            PARSER.get_origin_at              (                 ($WORD.getLine()),                 ($WORD.getCharPositionInLine()) @@ -2175,11 +2179,11 @@ returns [Computation result]              ($field_value_list.result)        )        { -         final FieldReference fr; +         final FieldAccess fa;           final Computation cp; -         fr = -            FieldReference.build +         fa = +            FieldAccess.build              (                 entry.get_car(),                 ($computation.result), @@ -2188,9 +2192,9 @@ returns [Computation result]           cp = entry.get_cdr().get_cdr(); -         RecurrentChecks.assert_can_be_used_as(cp, fr.get_type()); +         RecurrentChecks.assert_can_be_used_as(cp, fa.get_type()); -         assignments.add(new Cons(fr.get_field_name(), cp)); +         assignments.add(new Cons(fa.get_field_name(), cp));        }        $result = diff --git a/src/core/src/tonkadur/fate/v1/parser/Parser.java b/src/core/src/tonkadur/fate/v1/parser/ParserData.java index 4fc978d..45ef985 100644 --- a/src/core/src/tonkadur/fate/v1/parser/Parser.java +++ b/src/core/src/tonkadur/fate/v1/parser/ParserData.java @@ -13,6 +13,8 @@ import java.util.Set;  import org.antlr.v4.runtime.CharStreams;  import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.misc.ParseCancellationException; +  import tonkadur.parser.Context;  import tonkadur.parser.Origin; @@ -24,7 +26,7 @@ import tonkadur.fate.v1.error.DuplicateLocalVariableException;  import tonkadur.fate.v1.lang.Variable;  import tonkadur.fate.v1.lang.World; -public class Parser +public class ParserData  {     protected final World world;     protected final Context context; @@ -34,7 +36,7 @@ public class Parser     protected int breakable_levels;     protected int continue_levels; -   public Parser (final World world) +   public ParserData (final World world)     {        this.world = world; @@ -224,7 +226,7 @@ public class Parser     public PlayerChoiceData generate_player_choice_data ()     { -      return new Parser.PlayerChoiceData(this); +      return new ParserData.PlayerChoiceData(this);     }     public void enable_restricted_variable_stack_of (final PlayerChoiceData pcd) @@ -243,14 +245,15 @@ public class Parser     /* Internal class to make moving LocalVariable objects around easier. */     public static class LocalVariables     { -      protected final Deque<Map<String, Variable>> stack; +      // Can't clone if declared as Deque +      protected final ArrayDeque<Map<String, Variable>> stack;        protected LocalVariables ()        {           stack = new ArrayDeque<Map<String, Variable>>();        } -      protected LocalVariables (final Deque<Map<String, Variable>> stack) +      protected LocalVariables (final ArrayDeque<Map<String, Variable>> stack)        {           this.stack = stack.clone();        } @@ -264,12 +267,12 @@ public class Parser     public static class PlayerChoiceData     { -      protected final Parser parent; +      protected final ParserData parent;        protected final LocalVariables restricted_including_variables_stack;        protected LocalVariables previous_variable_stack;        protected final Deque<Set<String>> player_choice_variable_names; -      protected PlayerChoiceData (final Parser parent) +      protected PlayerChoiceData (final ParserData parent)        {           this.parent = parent; | 


