| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-19 04:44:53 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-09-19 04:44:53 +0200 | 
| commit | 190cf9e6c79375ab1ae9f36b5d13f1fd07c082e5 (patch) | |
| tree | 958d9605e188c9d0fd9dd88a8130fe7fc1348979 /src/core | |
| parent | ac4764a532994f84f6c6fea379d91d0662ba5669 (diff) | |
Maybe solves most grammar collisions.
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/lang/computation/Constant.java | 31 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 280 | 
2 files changed, 218 insertions, 93 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/lang/computation/Constant.java b/src/core/src/tonkadur/fate/v1/lang/computation/Constant.java index 97c5b02..6341d18 100644 --- a/src/core/src/tonkadur/fate/v1/lang/computation/Constant.java +++ b/src/core/src/tonkadur/fate/v1/lang/computation/Constant.java @@ -79,6 +79,37 @@ public class Constant extends Computation        return new Constant(origin, Type.STRING, as_string);     } +   public static Constant build_if_non_string +   ( +      final Origin origin, +      final String as_string +   ) +   { +      try +      { +         Integer.valueOf(as_string); + +         return new Constant(origin, Type.INT, as_string); +      } +      catch (final NumberFormatException nfe) +      { +         /* That's fine, we're just testing... */ +      } + +      try +      { +         Float.valueOf(as_string); + +         return new Constant(origin, Type.FLOAT, as_string); +      } +      catch (final NumberFormatException nfe) +      { +         /* That's fine, we're just testing... */ +      } + +      return null; +   } +     /**** Accessors ************************************************************/     @Override     public void get_visited_by (final ComputationVisitor cv) diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index 86bdab5..9f716b6 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -1564,12 +1564,40 @@ instr_cond_list  returns [List<Cons<Computation, Instruction>> result]  @init  { +   Computation condition; + +   condition = null; +     $result = new ArrayList<Cons<Computation, Instruction>>(); -   /* TODO: resolve grammar collisions */  }  :     ( -      L_PAREN WS* non_text_value WS+ +      ( +         ( +            (L_PAREN WS* non_text_value WS+) +            { +               condition = ($non_text_value.result); +            } +         ) +         | +         ( +            something_else=. +            { +               condition = +                  VariableFromWord.generate +                  ( +                     WORLD, +                     LOCAL_VARIABLES, +                     CONTEXT.get_origin_at +                     ( +                        ($something_else.getLine()), +                        ($something_else.getCharPositionInLine()) +                     ), +                     ($something_else.text).substring(1).trim() +                  ); +            } +         ) +      )           {              HIERARCHICAL_VARIABLES.push(new ArrayList());           } @@ -1584,7 +1612,7 @@ returns [List<Cons<Computation, Instruction>> result]        {           $result.add           ( -            new Cons(($non_text_value.result), ($general_fate_instr.result)) +            new Cons(condition, ($general_fate_instr.result))           );        }        WS* @@ -1592,6 +1620,17 @@ returns [List<Cons<Computation, Instruction>> result]     {     }  ; +catch [final Throwable e] +{ +   if ((e.getMessage() == null) || !e.getMessage().startsWith("Require")) +   { +      throw new ParseCancellationException(CONTEXT.toString() + ((e.getMessage() == null) ? "" : e.getMessage()), e); +   } +   else +   { +      throw new ParseCancellationException(e); +   } +}  instr_switch_list  returns [List<Cons<Computation, Instruction>> result] @@ -1851,16 +1890,43 @@ player_choice_cond_list  returns [List<Cons<Computation, Instruction>> result]  @init  { +   Computation condition; + +   condition = null; +     $result = new ArrayList<Cons<Computation, Instruction>>();  }  :     ( -      L_PAREN WS* non_text_value WS+ player_choice WS* R_PAREN -      { -         $result.add +      (           ( -            new Cons(($non_text_value.result), ($player_choice.result)) -         ); +            (L_PAREN WS* non_text_value WS+) +            { +               condition = ($non_text_value.result); +            } +         ) +         | +         ( +            something_else=. +            { +               condition = +                  VariableFromWord.generate +                  ( +                     WORLD, +                     LOCAL_VARIABLES, +                     CONTEXT.get_origin_at +                     ( +                        ($something_else.getLine()), +                        ($something_else.getCharPositionInLine()) +                     ), +                     ($something_else.text).substring(1).trim() +                  ); +            } +         ) +      ) +      player_choice WS* R_PAREN +      { +         $result.add(new Cons(condition, ($player_choice.result)));        }        WS*     )+ @@ -2273,6 +2339,10 @@ let_variable_list  returns [List<Cons<Variable, Computation>> result]  @init  { +   String var_name; + +   var_name = null; +     Map<String, Variable> variables;     variables = LOCAL_VARIABLES.peekFirst(); @@ -2282,7 +2352,22 @@ returns [List<Cons<Variable, Computation>> result]  :     (        WS* -      L_PAREN WS* new_reference_name WS+ value WS* R_PAREN +         ( +            ( +               L_PAREN WS* new_reference_name WS+ +               { +                  var_name = ($new_reference_name.result); +               } +            ) +            | +            ( +               something_else=. +               { +                  var_name = ($something_else.text).substring(1).trim(); +               } +            ) +         ) +         WS+ value WS* R_PAREN        {           final Variable v; @@ -2295,22 +2380,22 @@ returns [List<Cons<Variable, Computation>> result]                    ($L_PAREN.getCharPositionInLine())                 ),                 ($value.result).get_type(), -               ($new_reference_name.result) +               var_name              ); -         if (variables.containsKey(v.get_name())) +         if (variables.containsKey(var_name))           {              ErrorManager.handle              (                 new DuplicateLocalVariableException                 ( -                  variables.get(v.get_name()), +                  variables.get(var_name),                    v                 )              );           } -         variables.put(v.get_name(), v); +         variables.put(var_name, v);           $result.add(new Cons(v, ($value.result)));        } @@ -2413,12 +2498,31 @@ field_value_list  returns [List<Cons<Origin, Cons<String, Computation>>> result]  @init  { +   String field_name; + +   field_name = null; +     $result = new ArrayList<Cons<Origin, Cons<String, Computation>>>();  }  :     (        WS* -      L_PAREN WS* WORD WS+ value WS* R_PAREN +      ( +         ( +            L_PAREN WS* WORD WS+ +            { +               field_name = ($WORD.text); +            } +         ) +         | +         ( +            something_else=. +            { +               field_name = ($something_else.text).substring(1).trim(); +            } +         ) +      ) +      value WS* R_PAREN        {           $result.add           ( @@ -2431,7 +2535,7 @@ returns [List<Cons<Origin, Cons<String, Computation>>> result]                 ),                 new Cons                 ( -                  ($WORD.text), +                  field_name,                    ($value.result)                 )              ) @@ -3860,61 +3964,43 @@ returns [Computation result]           );     } -   | value_reference -   { -      $result = ($value_reference.result); -   } -     | WORD     { -      final Origin target_var_origin; -      Variable target_var; -      final String[] subrefs; - -      subrefs = ($WORD.text).split("\\."); - -      target_var_origin = -         CONTEXT.get_origin_at -         ( -            ($WORD.getLine()), -            ($WORD.getCharPositionInLine()) -         ); - -      target_var = LOCAL_VARIABLES.peekFirst().get(subrefs[0]); - -      if (target_var == null) -      { -         target_var = WORLD.variables().get(target_var_origin, subrefs[0]); -      } +      $result = null;        $result = -         new VariableReference +         Constant.build_if_non_string           (              CONTEXT.get_origin_at              (                 ($WORD.getLine()),                 ($WORD.getCharPositionInLine())              ), -            target_var +            ($WORD.text)           ); -      if (subrefs.length > 1) +      if ($result == null)        { -         final List<String> subrefs_list; - -         subrefs_list = new ArrayList(Arrays.asList(subrefs)); - -         subrefs_list.remove(0); -           $result = -            FieldReference.build +            VariableFromWord.generate              ( -               target_var_origin, -               ($result), -               subrefs_list +               WORLD, +               LOCAL_VARIABLES, +               CONTEXT.get_origin_at +               ( +                  ($WORD.getLine()), +                  ($WORD.getCharPositionInLine()) +               ), +               ($WORD.text)              );        }     } + +   | value_reference +   { +      $result = ($value_reference.result); +   } +  ;  catch [final Throwable e]  { @@ -3977,53 +4063,18 @@ returns [Reference result]     | (WORD | (VARIABLE_KW WORD WS* R_PAREN))     { -      final Origin target_var_origin; -      Variable target_var; -      final String[] subrefs; - -      subrefs = ($WORD.text).split("\\."); - -      target_var_origin = -         CONTEXT.get_origin_at -         ( -            ($WORD.getLine()), -            ($WORD.getCharPositionInLine()) -         ); - -      target_var = LOCAL_VARIABLES.peekFirst().get(subrefs[0]); - -      if (target_var == null) -      { -         target_var = WORLD.variables().get(target_var_origin, subrefs[0]); -      } -        $result = -         new VariableReference +         VariableFromWord.generate           ( +            WORLD, +            LOCAL_VARIABLES,              CONTEXT.get_origin_at              (                 ($WORD.getLine()),                 ($WORD.getCharPositionInLine())              ), -            target_var +            ($WORD.text)           ); - -      if (subrefs.length > 1) -      { -         final List<String> subrefs_list; - -         subrefs_list = new ArrayList(Arrays.asList(subrefs)); - -         subrefs_list.remove(0); - -         $result = -            FieldReference.build -            ( -               target_var_origin, -               ($result), -               subrefs_list -            ); -      }     }  ;  catch [final Throwable e] @@ -4042,18 +4093,61 @@ value_cond_list  returns [List<Cons<Computation, Computation>> result]  @init  { +   Computation condition; + +   condition = null; +     $result = new ArrayList<Cons<Computation, Computation>>();  }  :     ( -      L_PAREN WS* c=non_text_value WS+ v=value WS* R_PAREN WS* +      ( +         ( +            ( +               L_PAREN WS* c=non_text_value WS+ +            ) +            { +               condition = ($c.result); +            } +         ) +         | +         ( +            something_else=. +            { +               condition = +                  VariableFromWord.generate +                  ( +                     WORLD, +                     LOCAL_VARIABLES, +                     CONTEXT.get_origin_at +                     ( +                        ($something_else.getLine()), +                        ($something_else.getCharPositionInLine()) +                     ), +                     ($something_else.text).substring(1).trim() +                  ); +            } +         ) +      ) +      v=value WS* R_PAREN WS*        { -         $result.add(new Cons(($c.result), ($v.result))); +         $result.add(new Cons(condition, ($v.result)));        }     )+     {     }  ; +catch [final Throwable e] +{ +   if ((e.getMessage() == null) || !e.getMessage().startsWith("Require")) +   { +      throw new ParseCancellationException(CONTEXT.toString() + ((e.getMessage() == null) ? "" : e.getMessage()), e); +   } +   else +   { +      throw new ParseCancellationException(e); +   } +}  value_switch_list  returns [List<Cons<Computation, Computation>> result] | 


