public class LogicalExpressionConverter
extends java.lang.Object
Modifier and Type | Class and Description |
---|---|
static class |
LogicalExpressionConverter.Brackets
Brackets
|
static class |
LogicalExpressionConverter.Equals
"Equals" predicate
|
static interface |
LogicalExpressionConverter.EToken
Base interface for all tokens
|
private static class |
LogicalExpressionConverter.Lexer
Lexer which builds a token stream from the match expression.
|
static class |
LogicalExpressionConverter.Node
Expresssion tree node
|
static class |
LogicalExpressionConverter.Op
Logical operations
|
static class |
LogicalExpressionConverter.StartsWith
"StartsWith" predicate
|
static class |
LogicalExpressionConverter.Term
Base class for expression terms
|
Modifier and Type | Field and Description |
---|---|
private boolean |
caseSensitive
Should matches be checked case-sensitively?
|
private java.util.Set<java.lang.String> |
delim
Single character word delimiter for data strings
|
private java.lang.String |
expr
Logical expresssion to be converted
|
private java.util.Map<java.lang.String,LogicalExpressionConverter.Term> |
terms
Distinct terms found in the expression
|
Constructor and Description |
---|
LogicalExpressionConverter(java.lang.String expr,
boolean caseSensitive,
char... delims)
Constructor
|
Modifier and Type | Method and Description |
---|---|
private LogicalExpressionConverter.Node |
distribute(LogicalExpressionConverter.Op op1,
LogicalExpressionConverter.Op op2,
LogicalExpressionConverter.Node t)
Apply distributive law.
|
java.util.Map<java.lang.String,LogicalExpressionConverter.Term> |
getTerms()
Get distinct terms found in the expression.
|
private static <T extends java.lang.Comparable<T>> |
lexicographicalComparator()
Lexicographical comparator for lists of Comparable
|
static void |
main(java.lang.String... args)
Test program
|
private void |
processOp(LogicalExpressionConverter.EToken token,
java.util.Stack<LogicalExpressionConverter.EToken> stack,
java.util.List<LogicalExpressionConverter.EToken> rpn)
Process operation token
|
private LogicalExpressionConverter.Node |
pushNots(LogicalExpressionConverter.Node t)
Apply De Morgan's law and eliminate double negation.
|
java.util.List<java.util.List<LogicalExpressionConverter.Term>> |
toCNF(boolean debug)
Convert to Conjunctive Normal Form (CNF)
|
java.util.List<java.util.List<LogicalExpressionConverter.Term>> |
toDNF(boolean debug)
Convert to Disjunctive Normal Form (DNF)
|
private java.util.List<LogicalExpressionConverter.EToken> |
toList(LogicalExpressionConverter.Node t,
java.util.List<LogicalExpressionConverter.EToken> list)
Recursively convert expression tree to linear representation
|
java.util.List<java.util.List<LogicalExpressionConverter.Term>> |
toNormalForm(LogicalExpressionConverter.Op op1,
LogicalExpressionConverter.Op op2,
boolean debug)
Convert to Normal Form (CNF or DNF)
|
java.util.List<LogicalExpressionConverter.EToken> |
toRPN(boolean debug)
Convert to Reverse Polish Notation (RPN)
|
private final java.util.Set<java.lang.String> delim
private final boolean caseSensitive
private final java.lang.String expr
private java.util.Map<java.lang.String,LogicalExpressionConverter.Term> terms
public LogicalExpressionConverter(java.lang.String expr, boolean caseSensitive, char... delims)
expr
- Logical expresssion to be convertedcaseSensitive
- Should matches be checked case-sensitively?delims
- word delimiterspublic java.util.Map<java.lang.String,LogicalExpressionConverter.Term> getTerms()
public java.util.List<LogicalExpressionConverter.EToken> toRPN(boolean debug)
debug
- print tokens as they are provided by lexerprivate void processOp(LogicalExpressionConverter.EToken token, java.util.Stack<LogicalExpressionConverter.EToken> stack, java.util.List<LogicalExpressionConverter.EToken> rpn)
token
- operation tokenstack
- RPN stackrpn
- RPN expressionpublic java.util.List<java.util.List<LogicalExpressionConverter.Term>> toCNF(boolean debug)
debug
- Enables printing of tokens as they are provided by lexer and intermediate datapublic java.util.List<java.util.List<LogicalExpressionConverter.Term>> toDNF(boolean debug)
debug
- print tokens as they are provided by lexer and intermediate datapublic java.util.List<java.util.List<LogicalExpressionConverter.Term>> toNormalForm(LogicalExpressionConverter.Op op1, LogicalExpressionConverter.Op op2, boolean debug)
op1
- The innermost operation (OR or AND).op2
- The outermost operation (OR or AND).debug
- Enables printing of tokens as they are provided by lexer and intermediate data.private static <T extends java.lang.Comparable<T>> java.util.Comparator<java.util.List<T>> lexicographicalComparator()
T
- type parameterprivate java.util.List<LogicalExpressionConverter.EToken> toList(LogicalExpressionConverter.Node t, java.util.List<LogicalExpressionConverter.EToken> list)
t
- tree to be convertedlist
- list to hold a linear representationprivate LogicalExpressionConverter.Node pushNots(LogicalExpressionConverter.Node t)
t
- source treeprivate LogicalExpressionConverter.Node distribute(LogicalExpressionConverter.Op op1, LogicalExpressionConverter.Op op2, LogicalExpressionConverter.Node t)
op1
- innermost operation (OR or AND)op2
- outermost operation (OR or AND)t
- source treepublic static void main(java.lang.String... args) throws java.lang.Exception
args
- command line argumentsjava.lang.Exception
- if error