private IAutomaton Factor() { if (MayConsume('(')) { var result = Exec(); Consumes(')'); return(result); } else if (MayConsume('[')) { var negate = MayConsume('^'); var chars = CharSet.Empty; while (!MayConsume(']')) { var set = CharRange(); chars = chars.Union(set); } if (negate) { chars = chars.Negate(); } return(ConstructionKit.Consume(chars)); } else { var ch = CharRange(); return(ConstructionKit.Consume(ch)); } }
private IAutomaton PrimaryExpression() { var operand = Factor(); switch (Lookahead) { case '*': index++; return(ConstructionKit.Repeat(operand)); case '+': index++; return(ConstructionKit.Repeat(operand, 1)); case '?': index++; return(ConstructionKit.Repeat(operand, 0, 1)); case '{': index++; var min = Number(); if (MayConsume(',')) { var max = Number(); Consumes('}'); return(ConstructionKit.Repeat(operand, min, max)); } else { Consumes('}'); return(ConstructionKit.Repeat(operand, min, min)); } } return(operand); }
public void StepConcatenation() { var A = ConstructionKit.Consume(new CharSet('a')); var B = ConstructionKit.Consume(new CharSet('b')); var automaton = ConstructionKit.Concat(new[] { A, B }); automaton.Accepts("ab"); automaton.Rejects("ba"); }
public void StepCharacter() { var automaton = ConstructionKit.Consume(new CharSet('a', 'b', 'c')); automaton.Accepts("a"); automaton.Accepts("b"); automaton.Accepts("c"); automaton.Rejects("d"); }
public void StepRepetition() { var A = ConstructionKit.Consume(new CharSet('a')); var automaton = ConstructionKit.Repeat(A); automaton.Accepts(""); automaton.Accepts("a"); automaton.Accepts("aa"); automaton.Accepts("aaa"); automaton.Rejects("b"); }
public void StepAlternation() { var A = ConstructionKit.Consume(new CharSet('a')); var B = ConstructionKit.Consume(new CharSet('b')); var AA = ConstructionKit.Concat(new[] { A, A }); var automaton = ConstructionKit.Alternate(new[] { AA, B }); automaton.Accepts("b"); automaton.Accepts("aa"); automaton.Rejects("bb"); automaton.Rejects("a"); }
private IAutomaton ConcatExpression() { var lhs = PrimaryExpression(); while (Lookahead != '|' && Lookahead != Eos && Lookahead != ')') { var rhs = PrimaryExpression(); lhs = ConstructionKit.Concat(new[] { lhs, rhs }); } return(lhs); }
public IAutomaton Exec() { var lhs = ConcatExpression(); while (Lookahead == '|') { index++; var rhs = ConcatExpression(); lhs = ConstructionKit.Alternate(new[] { lhs, rhs }); } return(lhs); }
public void StepDeterminize() { var A = ConstructionKit.Consume(new CharSet('a')); var B = ConstructionKit.Consume(new CharSet('b')); var AA = ConstructionKit.Concat(new[] { A, A }); var AAorB = ConstructionKit.Alternate(new[] { AA, B }); var automaton = ConstructionKit.Repeat(AAorB) .Determinize(); automaton.Accepts(""); automaton.Accepts("aa"); automaton.Accepts("aa"); automaton.Accepts("aaaa"); automaton.Accepts("baab"); automaton.Accepts("baabaabb"); automaton.Rejects("a"); automaton.Rejects("aaa"); }