From 369fe9a772847a0ed13d9ef07f1e98c093b9ee07 Mon Sep 17 00:00:00 2001 From: Nathanael Sensfelder Date: Sat, 29 Aug 2020 17:30:12 +0200 Subject: Adds Let to the parser. --- src/core/src/tonkadur/fate/v1/parser/FateLexer.g4 | 1 + src/core/src/tonkadur/fate/v1/parser/FateParser.g4 | 90 ++++++++++++++++++++++ 2 files changed, 91 insertions(+) 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 result] } ; +let_variable_list +returns [List> result] +@init +{ + Map variables; + + variables = LOCAL_VARIABLES.peekFirst(); + + $result = new ArrayList>(); +} +: + ( + 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> 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 entry: let_list) + { + LOCAL_VARIABLES.peekFirst().remove(entry.get_car().get_name()); + } + } + | math_expression { $result = ($math_expression.result); -- cgit v1.2.3-70-g09d2