| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 | 1 | ||||
| -rw-r--r-- | src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 90 | 
2 files changed, 91 insertions, 0 deletions
| diff --git a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 index 96856c1..4684a3e 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 @@ -60,6 +60,7 @@ 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+; +LET_KW: L_PAREN 'let' SEP+;  MINUS_KW: L_PAREN ('minus'|'-') SEP+;  MIN_KW: L_PAREN ('min'('imum'?)) SEP+;  MAX_KW: L_PAREN ('max'('imum'?)) SEP+; diff --git a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 index da6ea7f..8bbd4d2 100644 --- a/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 +++ b/src/core/src/tonkadur/fate/v1/parser/FateParser.g4 @@ -1590,6 +1590,67 @@ returns [List<Type> result]     }  ; +let_variable_list +returns [List<Cons<Variable, Computation>> result] +@init +{ +   Map<String, Variable> variables; + +   variables = LOCAL_VARIABLES.peekFirst(); + +   $result = new ArrayList<Cons<Variable, Computation>>(); +} +: +   ( +      WS* +      L_PAREN WS* new_reference_name WS+ value WS* R_PAREN +      { +         final Variable v; + +         v = +            new Variable +            ( +               CONTEXT.get_origin_at +               ( +                  ($L_PAREN.getLine()), +                  ($L_PAREN.getCharPositionInLine()) +               ), +               ($value.result).get_type(), +               ($new_reference_name.result) +            ); + +         if (variables.containsKey(v.get_name())) +         { +            ErrorManager.handle +            ( +               new DuplicateLocalVariableException +               ( +                  variables.get(v.get_name()), +                  v +               ) +            ); +         } + +         variables.put(v.get_name(), v); + +         $result.add(new Cons(v, ($value.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); +   } +} +  variable_list  returns [VariableList result]  @init @@ -2364,6 +2425,35 @@ returns [Computation result]           LOCAL_VARIABLES.pop();        } +   | LET_KW +         L_PAREN WS* let_variable_list WS* R_PAREN +         WS* +         value +         WS* +      R_PAREN +      { +         final List<Cons<Variable, Computation>> let_list; + +         let_list = ($let_variable_list.result); + +         $result = +            new Let +            ( +               CONTEXT.get_origin_at +               ( +                  ($LET_KW.getLine()), +                  ($LET_KW.getCharPositionInLine()) +               ), +               let_list, +               ($value.result) +            ); + +         for (final Cons<Variable, Computation> entry: let_list) +         { +            LOCAL_VARIABLES.peekFirst().remove(entry.get_car().get_name()); +         } +      } +     | math_expression     {        $result = ($math_expression.result); | 


