summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/hastabel/Strings.java | 109 | ||||
-rw-r--r-- | src/hastabel/Variables.java | 94 | ||||
-rw-r--r-- | src/hastabel/World.java | 15 | ||||
-rw-r--r-- | src/hastabel/lang/Element.java | 45 | ||||
-rw-r--r-- | src/hastabel/lang/Expression.java | 50 | ||||
-rw-r--r-- | src/hastabel/lang/Formula.java | 6 | ||||
-rw-r--r-- | src/hastabel/lang/Predicate.java | 9 | ||||
-rw-r--r-- | src/hastabel/lang/PredicateFormula.java | 19 | ||||
-rw-r--r-- | src/hastabel/lang/Variable.java | 9 |
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); + } +} |