summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/hastabel/Strings.java109
-rw-r--r--src/hastabel/Variables.java94
-rw-r--r--src/hastabel/World.java15
-rw-r--r--src/hastabel/lang/Element.java45
-rw-r--r--src/hastabel/lang/Expression.java50
-rw-r--r--src/hastabel/lang/Formula.java6
-rw-r--r--src/hastabel/lang/Predicate.java9
-rw-r--r--src/hastabel/lang/PredicateFormula.java19
-rw-r--r--src/hastabel/lang/Variable.java9
9 files changed, 313 insertions, 43 deletions
diff --git a/src/hastabel/Strings.java b/src/hastabel/Strings.java
new file mode 100644
index 0000000..b90ccf7
--- /dev/null
+++ b/src/hastabel/Strings.java
@@ -0,0 +1,109 @@
+package hastabel;
+
+import hastabel.lang.Type;
+import hastabel.lang.Element;
+import hastabel.lang.Predicate;
+
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Set;
+
+import java.util.regex.Pattern;
+
+public class Strings
+{
+
+ private final Map<String, Element> AS_ELEMENT;
+ private final Collection<Pattern> regexes;
+
+ private final Type string_type;
+ private final LogicWorld world;
+
+ private final String anon_string_prefix;
+ private int anon_string_count;
+
+ private static String cleanup_string (final String str)
+ {
+ return str.replaceAll("\\s","").toLowerCase();
+ }
+
+ public Strings (final Type string_type, final LogicWorld world)
+ {
+ AS_ELEMENT = new HashMap<String, Element>();
+ regexes = new ArrayList<Pattern>();
+
+ anon_string_prefix = "_string_"; /* TODO: use a program param. */
+ anon_string_count = 0;
+
+ this.string_type = string_type;
+ this.world = world;
+ }
+
+ public Element get_string_as_element (final String str)
+ {
+ Element elem;
+
+ elem = AS_ELEMENT.get(cleanup_string(str));
+
+ if (elem == null)
+ {
+ elem =
+ world.get_elements_manager().declare
+ (
+ string_type,
+ (anon_string_prefix + anon_string_count)
+ );
+
+ anon_string_count += 1;
+
+ AS_ELEMENT.put(str, elem);
+ }
+
+ return elem;
+ }
+
+ public Element get_regex_as_element (String str)
+ {
+ str = str.toLowerCase();
+ regexes.add(Pattern.compile(str.substring(1, (str.length() - 1))));
+
+ return get_string_as_element(str);
+ }
+
+ public void populate_regex_predicate (final Predicate rp)
+ {
+ final Set<Map.Entry<String, Element>> candidates;
+
+ candidates = AS_ELEMENT.entrySet();
+
+ for (final Pattern p: regexes)
+ {
+ for (final Map.Entry<String, Element> c: candidates)
+ {
+ String word;
+
+ word = c.getKey();
+ /* Remove the surounding "" */
+ word = word.substring(1, (word.length() - 1));
+
+ if (p.matcher(word).matches())
+ {
+ rp.add_member
+ (
+ Arrays.asList
+ (
+ new Element[]
+ {
+ c.getValue(),
+ AS_ELEMENT.get("\"" + p.pattern() + "\"")
+ }
+ )
+ );
+ }
+ }
+ }
+ }
+}
diff --git a/src/hastabel/Variables.java b/src/hastabel/Variables.java
new file mode 100644
index 0000000..eb19bc7
--- /dev/null
+++ b/src/hastabel/Variables.java
@@ -0,0 +1,94 @@
+package hastabel;
+
+import hastabel.lang.Type;
+import hastabel.lang.Variable;
+import hastabel.lang.Expression;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Variables
+{
+ private final Map<String, Variable> from_string;
+ private final Map<String, Variable> seeked;
+ private int next_id;
+
+ public Variables ()
+ {
+ from_string = new HashMap<String, Variable>();
+ seeked = new HashMap<String, Variable>();
+ }
+
+ private String generate_new_anonymous_variable_name ()
+ {
+ final String result;
+
+ result = "_var" + next_id;
+
+ next_id += 1;
+
+ return result;
+ }
+
+ public void seek (final Type type, final String var_name)
+ throws Exception
+ {
+ final Variable var;
+
+ var = add_variable(type, var_name);
+ seeked.put(var_name, var);
+ }
+
+ public Variable add_variable (final Type type, final String var_name)
+ throws Exception
+ {
+ final Variable result;
+
+ if (from_string.containsKey(var_name))
+ {
+ throw
+ new Exception
+ (
+ "[F] Invalid property: the variable name \""
+ + var_name
+ + "\" is declared multiple times."
+ );
+ }
+
+ result = new Variable(type, var_name);
+
+ from_string.put(var_name, result);
+
+ return result;
+ }
+
+ public Variable get_variable (final String var_name)
+ throws Exception
+ {
+ final Variable result;
+
+ result = from_string.get(var_name);
+
+ if (result == null)
+ {
+ throw
+ new Exception
+ (
+ "[F] Variable \""
+ + var_name
+ + "\" is used, but not declared."
+ );
+ }
+
+ return result;
+ }
+
+ public Variable generate_new_anonymous_variable (final Type t)
+ throws Exception
+ {
+ return add_variable(t, generate_new_anonymous_variable_name());
+ }
+}
diff --git a/src/hastabel/World.java b/src/hastabel/World.java
index 08aff4b..181828a 100644
--- a/src/hastabel/World.java
+++ b/src/hastabel/World.java
@@ -1,5 +1,7 @@
package hastabel;
+import hastabel.lang.Type;
+
import java.io.IOException;
import org.antlr.v4.runtime.CharStreams;
@@ -10,6 +12,8 @@ public class World extends LogicWorld
private final Templates templates_mgr;
private final TemplateInstances template_inst_mgr;
+ private final Strings strings_mgr;
+
private final Types types_mgr;
private boolean is_erroneous;
@@ -18,11 +22,17 @@ public class World extends LogicWorld
{
super();
+ final Type string_type;
+
templates_mgr = new Templates();
template_inst_mgr = new TemplateInstances();
types_mgr = new Types();
+ string_type = types_mgr.declare(null, "String");
+
+ strings_mgr = new Strings(string_type, this);
+
is_erroneous = false;
}
@@ -66,4 +76,9 @@ public class World extends LogicWorld
{
return types_mgr;
}
+
+ public Strings get_strings_manager ()
+ {
+ return strings_mgr;
+ }
}
diff --git a/src/hastabel/lang/Element.java b/src/hastabel/lang/Element.java
index b167885..f69fca1 100644
--- a/src/hastabel/lang/Element.java
+++ b/src/hastabel/lang/Element.java
@@ -1,50 +1,9 @@
package hastabel.lang;
-public class Element
+public class Element extends Expression
{
- public final Type type;
- public final String name;
-
public Element (final Type type, final String name)
{
- this.type = type;
- this.name = name;
- }
-
- public String get_name ()
- {
- return name;
- }
-
- public Type get_type ()
- {
- return type;
- }
-
- @Override
- public boolean equals (Object o)
- {
- final Element e;
-
- if ((o == null) || !(o instanceof Element))
- {
- return false;
- }
-
- e = (Element) o;
-
- return (e.name.equals(name) && e.type.equals(type));
- }
-
- @Override
- public int hashCode ()
- {
- return (name + '@' + type.get_name()).hashCode();
- }
-
- @Override
- public String toString ()
- {
- return (type.get_name() + " " + name);
+ super(type, name);
}
}
diff --git a/src/hastabel/lang/Expression.java b/src/hastabel/lang/Expression.java
new file mode 100644
index 0000000..3e48426
--- /dev/null
+++ b/src/hastabel/lang/Expression.java
@@ -0,0 +1,50 @@
+package hastabel.lang;
+
+public abstract class Expression
+{
+ public final Type type;
+ public final String name;
+
+ public Expression (final Type type, final String name)
+ {
+ this.type = type;
+ this.name = name;
+ }
+
+ public String get_name ()
+ {
+ return name;
+ }
+
+ public Type get_type ()
+ {
+ return type;
+ }
+
+ @Override
+ public boolean equals (Object o)
+ {
+ final Expression e;
+
+ if ((o == null) || !(o instanceof Expression))
+ {
+ return false;
+ }
+
+ e = (Expression) o;
+
+ return (e.name.equals(name) && e.type.equals(type));
+ }
+
+ @Override
+ public int hashCode ()
+ {
+ return (name + '@' + type.get_name()).hashCode();
+ }
+
+ @Override
+ public String toString ()
+ {
+ return (type.get_name() + " " + name);
+ }
+}
diff --git a/src/hastabel/lang/Formula.java b/src/hastabel/lang/Formula.java
new file mode 100644
index 0000000..0846d41
--- /dev/null
+++ b/src/hastabel/lang/Formula.java
@@ -0,0 +1,6 @@
+package hastabel.lang;
+
+public abstract class Formula
+{
+
+}
diff --git a/src/hastabel/lang/Predicate.java b/src/hastabel/lang/Predicate.java
index 835206c..69a0221 100644
--- a/src/hastabel/lang/Predicate.java
+++ b/src/hastabel/lang/Predicate.java
@@ -152,4 +152,13 @@ public class Predicate
return sb.toString();
}
+
+ public Formula as_formula (final List<Expression> params)
+ {
+ final Formula result;
+
+ result = new PredicateFormula(this, params);
+
+ return result;
+ }
}
diff --git a/src/hastabel/lang/PredicateFormula.java b/src/hastabel/lang/PredicateFormula.java
new file mode 100644
index 0000000..cd86aaf
--- /dev/null
+++ b/src/hastabel/lang/PredicateFormula.java
@@ -0,0 +1,19 @@
+package hastabel.lang;
+
+import java.util.List;
+
+class PredicateFormula extends Formula
+{
+ private final Predicate parent;
+ private final List<Expression> params;
+
+ public PredicateFormula
+ (
+ final Predicate parent,
+ final List<Expression> params
+ )
+ {
+ this.parent = parent;
+ this.params = params;
+ }
+}
diff --git a/src/hastabel/lang/Variable.java b/src/hastabel/lang/Variable.java
new file mode 100644
index 0000000..9df0d4f
--- /dev/null
+++ b/src/hastabel/lang/Variable.java
@@ -0,0 +1,9 @@
+package hastabel.lang;
+
+public class Variable extends Expression
+{
+ public Variable (final Type type, final String name)
+ {
+ super(type, name);
+ }
+}