summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-06-15 22:57:38 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2021-06-15 22:57:38 +0200
commitfbe5a405d5f8f9be0794a2ff4ac96125869793fe (patch)
treed77bb8f3248df97439bd85acbfb27eab635f9501
parent32933e2d9c6319f2c88be2578e420c441e935f15 (diff)
...
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Paragraph.java9
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/meta/VariableFromWord.java4
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/type/ExtraType.java43
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g492
-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;