summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-19 04:44:53 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2020-09-19 04:44:53 +0200
commit190cf9e6c79375ab1ae9f36b5d13f1fd07c082e5 (patch)
tree958d9605e188c9d0fd9dd88a8130fe7fc1348979
parentac4764a532994f84f6c6fea379d91d0662ba5669 (diff)
Maybe solves most grammar collisions.
-rw-r--r--src/core/src/tonkadur/fate/v1/lang/computation/Constant.java31
-rw-r--r--src/core/src/tonkadur/fate/v1/parser/FateParser.g4280
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]