| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-29 17:30:12 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2020-08-29 17:30:12 +0200 |
| commit | 369fe9a772847a0ed13d9ef07f1e98c093b9ee07 (patch) | |
| tree | b13d3c7a7da8d6b6074b4abf262644651b70a29f | |
| parent | 0a252ea22f7acc1a769280c421c5630c9f1d29a8 (diff) | |
Adds Let to the parser.
| -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); |


