public override EpsilonNfa Apply(PositiveExpression expression, Automaton param) { var nfa = new EpsilonNfa(param); var body = Invoke(expression.Matched, param); param.AddTransition(nfa.Start, body.Start, Transition.Type.Positive); param.AddTransition(body.End, nfa.End, Transition.Type.End); return(nfa); }
Expression ParseFunction() { if (_sourceWindow.AdvanceIfMatches("(=")) { var sub = ParseExpression(); if (!_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost"); } var exp = new PositiveExpression(sub); return(exp); } else if (_sourceWindow.AdvanceIfMatches("(!")) { var sub = ParseExpression(); if (!_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost"); } var exp = new NegativeExpression(sub); return(exp); } else if (_sourceWindow.AdvanceIfMatches("(<&")) { //表达式引用 string name; if (!_sourceWindow.AdvanceIfName(out name)) { throw new ArgumentException("invalid name."); } if (!_sourceWindow.AdvanceIfMatches('>')) { throw new ArgumentException("> lost."); } if (!_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost."); } var exp = new ReferenceExpression(name); return(exp); } else if (_sourceWindow.AdvanceIfMatches("(<$")) { string name; int index = -1; if (_sourceWindow.AdvanceIfName(out name)) { if (_sourceWindow.AdvanceIfMatches(';')) { if (!_sourceWindow.AdvanceIfPositiveInteger(out index)) { throw new ArgumentException("Positive numbers required after ;"); } } } else if (!_sourceWindow.AdvanceIfPositiveInteger(out index)) { throw new ArgumentException("Positive numbers required after (<$"); } if (!_sourceWindow.AdvanceIfMatches('>')) { throw new ArgumentException("> lost."); } if (!_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost."); } var exp = new MatchExpression(name, index); return(exp); } else if (_sourceWindow.AdvanceIfMatches("(<")) { string name; if (!_sourceWindow.AdvanceIfName(out name)) { throw new ArgumentException("Name lost"); } if (!_sourceWindow.AdvanceIfMatches('>')) { throw new ArgumentException("> lost"); } var sub = ParseExpression(); if (!_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost"); } var exp = new CaptureExpression(name, sub); return(exp); } else if (_sourceWindow.AdvanceIfMatches("(?")) { var sub = ParseExpression(); if (_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost"); } var exp = new CaptureExpression(sub); return(exp); } else if (_sourceWindow.AdvanceIfMatches('('))//subexpression { var exp = ParseExpression(); if (!_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost"); } return(exp); } else { return(null); } }
public override Expression Apply(PositiveExpression expression, MergeParameter param) { return(new PositiveExpression( Invoke(expression, param))); }
public bool Equals(PositiveExpression obj) { return(Matched.Equals(obj.Matched)); }
public void Visit(PositiveExpression expression) { _returnValue = this.Apply(expression, _paramValue); }
public abstract ReturnT Apply(PositiveExpression expression, ParamT param);
Expression ParseFunction() { if (_sourceWindow.AdvanceIfMatches("(=")) { var sub = ParseExpression(); if (!_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost"); } var exp = new PositiveExpression(sub); return exp; } else if (_sourceWindow.AdvanceIfMatches("(!")) { var sub = ParseExpression(); if (!_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost"); } var exp = new NegativeExpression(sub); return exp; } else if (_sourceWindow.AdvanceIfMatches("(<&")) { //表达式引用 string name; if (!_sourceWindow.AdvanceIfName(out name)) { throw new ArgumentException("invalid name."); } if (!_sourceWindow.AdvanceIfMatches('>')) { throw new ArgumentException("> lost."); } if (!_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost."); } var exp = new ReferenceExpression(name); return exp; } else if (_sourceWindow.AdvanceIfMatches("(<$")) { string name; int index = -1; if (_sourceWindow.AdvanceIfName(out name)) { if (_sourceWindow.AdvanceIfMatches(';')) { if (!_sourceWindow.AdvanceIfPositiveInteger(out index)) { throw new ArgumentException("Positive numbers required after ;"); } } } else if (!_sourceWindow.AdvanceIfPositiveInteger(out index)) { throw new ArgumentException("Positive numbers required after (<$"); } if (!_sourceWindow.AdvanceIfMatches('>')) { throw new ArgumentException("> lost."); } if (!_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost."); } var exp = new MatchExpression(name, index); return exp; } else if (_sourceWindow.AdvanceIfMatches("(<")) { string name; if (!_sourceWindow.AdvanceIfName(out name)) { throw new ArgumentException("Name lost"); } if (!_sourceWindow.AdvanceIfMatches('>')) { throw new ArgumentException("> lost"); } var sub = ParseExpression(); if (!_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost"); } var exp = new CaptureExpression(name, sub); return exp; } else if (_sourceWindow.AdvanceIfMatches("(?")) { var sub = ParseExpression(); if (_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost"); } var exp = new CaptureExpression(sub); return exp; } else if (_sourceWindow.AdvanceIfMatches('('))//subexpression { var exp = ParseExpression(); if (!_sourceWindow.AdvanceIfMatches(')')) { throw new ArgumentException(") lost"); } return exp; } else return null; }
public bool Equals(PositiveExpression obj) { return Matched.Equals(obj.Matched); }