Check that sub-functions in replacement patterns are defined
This commit is contained in:
parent
ba468d199a
commit
bea2eb67c8
@ -53,6 +53,14 @@ public class PatternRule implements Rule {
|
||||
return ruleType;
|
||||
}
|
||||
|
||||
Pattern getTarget() {
|
||||
return target;
|
||||
}
|
||||
|
||||
List<Pattern> getReplacements() {
|
||||
return replacements;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ObjectArrayList<Function> execute(final Function func) throws Error, InterruptedException {
|
||||
return target.match(func)
|
||||
|
@ -3,9 +3,11 @@ package it.cavallium.warppi.math.rules.dsl;
|
||||
import it.cavallium.warppi.math.rules.Rule;
|
||||
import it.cavallium.warppi.math.rules.dsl.frontend.Lexer;
|
||||
import it.cavallium.warppi.math.rules.dsl.frontend.Parser;
|
||||
import it.cavallium.warppi.math.rules.dsl.patterns.SubFunctionPattern;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class RulesDsl {
|
||||
private RulesDsl() {}
|
||||
@ -13,6 +15,28 @@ public class RulesDsl {
|
||||
public static List<Rule> makeRules(final String source) {
|
||||
final Lexer lexer = new Lexer(source);
|
||||
final Parser parser = new Parser(lexer.lex());
|
||||
return Collections.unmodifiableList(parser.parse());
|
||||
final List<PatternRule> rules = parser.parse();
|
||||
|
||||
for (final PatternRule rule : rules) {
|
||||
checkSubFunctionsDefined(rule);
|
||||
}
|
||||
|
||||
return Collections.unmodifiableList(rules);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies that all sub-functions in the replacement patterns of a <code>PatternRule</code>
|
||||
* are defined (captured) in the target pattern.
|
||||
*
|
||||
* @param rule The rule to check.
|
||||
* @throws RuntimeException if any replacement pattern uses undefined sub-functions.
|
||||
*/
|
||||
private static void checkSubFunctionsDefined(final PatternRule rule) {
|
||||
final Set<SubFunctionPattern> defined = rule.getTarget().getSubFunctions();
|
||||
for (final Pattern replacement : rule.getReplacements()) {
|
||||
if (!defined.containsAll(replacement.getSubFunctions())) {
|
||||
throw new RuntimeException("Undefined sub-function(s) in replacements for " + rule.getRuleName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -61,4 +61,9 @@ public class RulesDslTest {
|
||||
public void parserError() {
|
||||
RulesDsl.makeRules("existence test: x + y ->");
|
||||
}
|
||||
|
||||
@Test(expected = RuntimeException.class)
|
||||
public void undefinedSubFunction() {
|
||||
RulesDsl.makeRules("expansion test: x -> x + y");
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user