private Expression AtomExpression() { if (Current.TokenKind == TokenKind.StringStart) { return ReadString(); } else if (Current.TokenKind == TokenKind.ID) { Token id = Consume(); Expression exp = null; if (Current.TokenKind == TokenKind.LParen) { Consume(); Expression[] args = ReadArguments(); Consume(TokenKind.RParen); exp = new FCall(id.Line, id.Col, id.Data, args); } else { exp = new Name(id.Line, id.Col, id.Data); } while (Current.TokenKind == TokenKind.Dot || Current.TokenKind == TokenKind.LBracket) { if (Current.TokenKind == TokenKind.Dot) { Consume(); Token field = Consume(TokenKind.ID); if (Current.TokenKind == TokenKind.LParen) { Consume(); Expression[] args = ReadArguments(); Consume(TokenKind.RParen); exp = new MCall(field.Line, field.Col, exp, field.Data, args); } else { exp = new FieldAccess(field.Line, field.Col, exp, field.Data); } } else { Token bracket = Current; Consume(); Expression indexExp = TopExpression(); Consume(TokenKind.RBracket); exp = new ArrayAccess(bracket.Line, bracket.Col, exp, indexExp); } } return exp; } else if (Current.TokenKind == TokenKind.Integer) { int value = int.Parse(Current.Data); IntLiteral intLiteral = new IntLiteral(Current.Line, Current.Col, value); Consume(); return intLiteral; } else if (Current.TokenKind == TokenKind.Double) { double value = double.Parse(Current.Data); DoubleLiteral dLiteral = new DoubleLiteral(Current.Line, Current.Col, value); Consume(); return dLiteral; } else if (Current.TokenKind == TokenKind.LParen) { Consume(); Expression exp = TopExpression(); Consume(TokenKind.RParen); return exp; } else { throw new TmplException(string.Format("Invalid token in expression: " + Current.TokenKind + ". Was expecting ID or string.L{0}/C{1}", Current.Line, Current.Col), Current.Line, Current.Col); } }
private object EvalExpression(Expression exp) { CurrentExpression = exp; try { if (exp is StringLiteral) { return(((StringLiteral)exp).Content); } else if (exp is Name) { return(GetValue(((Name)exp).Id)); } else if (exp is FieldAccess) { FieldAccess fa = (FieldAccess)exp; object obj = EvalExpression(fa.Exp); string propertyName = fa.Field; return(ProcessProperty(obj, propertyName)); } else if (exp is MCall) { MCall ma = (MCall)exp; object obj = EvalExpression(ma.CallObject); string methodName = ma.Name; return(ProcessMCall(obj, methodName, ProcessArguments(ma.Args))); } else if (exp is IntLiteral) { return(((IntLiteral)exp).Value); } else if (exp is DoubleLiteral) { return(((DoubleLiteral)exp).Value); } else if (exp is FCall) { FCall fcall = (FCall)exp; if (!_fnTbl.ContainsKey(fcall.Name)) { string msg = string.Format("Function {0} is not defined", fcall.Name); throw new TmplException(msg, exp.Line, exp.Col); } FunctionDefinition func = _fnTbl[fcall.Name]; object[] values = ProcessArguments(fcall.Args); return(func(values)); } else if (exp is StringExpression) { StringExpression stringExp = (StringExpression)exp; StringBuilder sb = new StringBuilder(); foreach (Expression ex in stringExp.Expressions) { sb.Append(EvalExpression(ex)); } return(sb.ToString()); } else if (exp is BinaryExpression) { return(ProcessBinaryExpression(exp as BinaryExpression)); } else if (exp is ArrayAccess) { return(ProcessArrayAccess(exp as ArrayAccess)); } else { throw new TmplException("Invalid expression type: " + exp.GetType().Name, exp.Line, exp.Col); } } catch (TmplException ex) { DisplayError(ex); return(null); } catch (Exception ex) { string _Message = "Message=" + ex.Message + "," + "Source=" + ex.Source + ",StackTrace=" + ex.StackTrace + ",TargetSite=" + ex.TargetSite + ""; DisplayError(new TmplException(_Message, CurrentExpression.Line, CurrentExpression.Col)); return(null); } }
private Expression AtomExpression() { if (Current.TokenKind == TokenKind.StringStart) { return(ReadString()); } else if (Current.TokenKind == TokenKind.ID) { Token id = Consume(); Expression exp = null; if (Current.TokenKind == TokenKind.LParen) { Consume(); Expression[] args = ReadArguments(); Consume(TokenKind.RParen); exp = new FCall(id.Line, id.Col, id.Data, args); } else { exp = new Name(id.Line, id.Col, id.Data); } while (Current.TokenKind == TokenKind.Dot || Current.TokenKind == TokenKind.LBracket) { if (Current.TokenKind == TokenKind.Dot) { Consume(); Token field = Consume(TokenKind.ID); if (Current.TokenKind == TokenKind.LParen) { Consume(); Expression[] args = ReadArguments(); Consume(TokenKind.RParen); exp = new MCall(field.Line, field.Col, exp, field.Data, args); } else { exp = new FieldAccess(field.Line, field.Col, exp, field.Data); } } else { Token bracket = Current; Consume(); Expression indexExp = TopExpression(); Consume(TokenKind.RBracket); exp = new ArrayAccess(bracket.Line, bracket.Col, exp, indexExp); } } return(exp); } else if (Current.TokenKind == TokenKind.Integer) { int value = int.Parse(Current.Data); IntLiteral intLiteral = new IntLiteral(Current.Line, Current.Col, value); Consume(); return(intLiteral); } else if (Current.TokenKind == TokenKind.Double) { double value = double.Parse(Current.Data); DoubleLiteral dLiteral = new DoubleLiteral(Current.Line, Current.Col, value); Consume(); return(dLiteral); } else if (Current.TokenKind == TokenKind.LParen) { Consume(); Expression exp = TopExpression(); Consume(TokenKind.RParen); return(exp); } else { throw new VoltException(string.Format("Invalid token in expression: " + Current.TokenKind + ". Was expecting ID or string.L{0}/C{1}", Current.Line, Current.Col), Current.Line, Current.Col); } }