private Fact ParseFact()
{
string name = this.ParseName();
if (name == "then" || name == "end")
{
this.PushToken(name);
return null;
}
Token token = this.NextToken();
if (token == null)
throw new LexerException("Unexpected End of Input");
if (token.Type == TokenType.EndOfLine)
return new IsFact(name, true);
if (token.Type == TokenType.Separator && token.Value == ".")
return this.ParsePropertyFact(name);
if (token.Type != TokenType.Name || (token.Value != "is" && token.Value != "is_not" && token.Value != "is_a"))
if (token.Type != TokenType.Operator || !comparisonVerbs.ContainsKey(token.Value))
throw new LexerException(string.Format("Unexpected '{0}'", token.Value));
string verb = token.Value;
object value = this.ParseValue();
this.ParseEndOfLine();
if (verb == "is")
return new IsFact(name, value);
else if (verb == "is_not")
return new IsNotFact(name, value);
else if (verb == "is_a")
return new IsAFact(name, (string) value);
else
return new ComparisonFact(name, comparisonVerbs[verb], value);
}