private IExpression ParseTerm()
{
Token token = this.NextToken();
IExpression expression = null;
if (token == null)
return null;
if (token.Type == TokenType.Variable)
{
expression = new VariableExpression(new Variable(token.Value));
if (this.TryParseToken(TokenType.Separator, "("))
{
var list = this.ParseExpressionList();
this.ParseToken(TokenType.Separator, ")");
expression = new CallExpression(expression, list);
}
}
else if (token.Type == TokenType.Atom)
{
if (token.Value == "false")
return new ConstantExpression(false);
if (token.Value == "true")
return new ConstantExpression(true);
if (token.Value == "fun")
return this.ParseFunExpression();
if (token.Value == "receive")
return this.ParseReceiveExpression();
expression = new AtomExpression(new Atom(token.Value));
if (this.TryParseToken(TokenType.Separator, "("))
{
var list = this.ParseExpressionList();
this.ParseToken(TokenType.Separator, ")");
expression = new CallExpression(expression, list);
}
else if (this.TryParseToken(TokenType.Separator, ":"))
{
var nexpression = new AtomExpression(new Atom(this.ParseAtom()));
this.ParseToken(TokenType.Separator, "(");
var list = this.ParseExpressionList();
this.ParseToken(TokenType.Separator, ")");
expression = new QualifiedCallExpression(expression, nexpression, list);
}
}
else if (token.Type == TokenType.Integer)
expression = new ConstantExpression(int.Parse(token.Value, CultureInfo.InvariantCulture));
else if (token.Type == TokenType.Real)
expression = new ConstantExpression(double.Parse(token.Value, CultureInfo.InvariantCulture));
else if (token.Type == TokenType.String)
expression = new ConstantExpression(token.Value);
else if (token.Type == TokenType.Separator && token.Value == "(")
{
expression = this.ParseSimpleExpression();
this.ParseToken(TokenType.Separator, ")");
}
else if (token.Type == TokenType.Separator && token.Value == "{")
{
var expressions = this.ParseExpressionList();
this.ParseToken(TokenType.Separator, "}");
expression = new TupleExpression(expressions);
}
else if (token.Type == TokenType.Separator && token.Value == "[")
{
var expressions = this.ParseExpressionList();
IExpression tailexpression = null;
if (this.TryParseToken(TokenType.Separator, "|"))
tailexpression = this.ParseSimpleExpression();
this.ParseToken(TokenType.Separator, "]");
expression = new ListExpression(expressions, tailexpression);
}
else
this.PushToken(token);
return expression;
}