/// <summary> /// Sorts expression /// </summary> /// <returns></returns> public override Expr Parse(object context) { var constExp = context as ConstantExpr; var c = _tokenIt.NextToken; var t = _tokenIt.Advance(); _parser.SetupContext(constExp, c); // Get the function symbol. var paramListExpressions = new List <Expr>(); paramListExpressions.Add(constExp); var nameExp = Exprs.Ident(t.Token.Text, t); var expr = Exprs.FunctionCall(nameExp, paramListExpressions, t); // Move the postfix token. _tokenIt.Advance(); return(expr); }
/// <summary> /// Parse the expression. /// </summary> /// <returns></returns> public override Expr Parse() { var printToken = _tokenIt.NextToken; var lineToken = _tokenIt.AdvanceAndGet <Token>(); Expr lineExp = null; if (lineToken.Kind == TokenKind.Multi) { lineExp = _parser.ParseInterpolatedExpression(lineToken); } else { lineExp = Exprs.Const(new LString((string)lineToken.Value), printToken); } var nameExp = Exprs.Ident(printToken.Token.Text, printToken); var exp = (FunctionCallExpr)Exprs.FunctionCall(nameExp, null, printToken); exp.ParamListExpressions.Add(lineExp); // Move past this plugin. _tokenIt.Advance(); return(exp); }
/// <summary> /// run step 123. /// </summary> /// <returns></returns> public override Expr Parse() { _tokenIt.Expect(Tokens.Run); // 1. Expect run ( function | step ) if (_tokenIt.NextToken.Token == Tokens.Function || _tokenIt.NextToken.Token.Text == "step") { _tokenIt.Advance(); } // 2. Expect identifier for function name if (!(_tokenIt.NextToken.Token.IsLiteralAny() || _tokenIt.NextToken.Token.Kind == TokenKind.Ident)) { _tokenIt.BuildSyntaxExpectedException("identifier or string"); } // 3. get the name of the function to run. var name = _tokenIt.NextToken.Token.Text; var nameToken = _tokenIt.NextToken; var next = _tokenIt.Peek(1, false); // Case 1: run step cleanup ; | newline | eof if (Terminators.ExpFlexibleEnd.ContainsKey(next.Token) || next.Token == Tokens.EndToken) { var nameExp = Exprs.Ident(name, nameToken); var funcExp = Exprs.FunctionCall(nameExp, null, nameToken); // Move past token _tokenIt.Advance(); return(funcExp); } // Case 2: run step cleanup on <functioncall> if (next.Token.Text == "on" || next.Token.Text == "after") { _tokenIt.Advance(1); var runExp = ParseRunExpr(nameToken); var nameExp = Exprs.Ident(name, nameToken); var funcExp = Exprs.FunctionCall(nameExp, null, nameToken); runExp.FuncCallOnAfterExpr = funcExp; runExp.Mode = next.Token.Text; return(runExp); } // Case 3: run step cleanup('c:\tempdir') on <functioncall> if (next.Token == Tokens.LeftParenthesis || next.Token == Tokens.Dot) { var funcExp = _parser.ParseIdExpression(name, null, false); if (_tokenIt.NextToken.Token.Text == "on" || _tokenIt.NextToken.Token.Text == "after") { var t = _tokenIt.NextToken; var runExp = ParseRunExpr(nameToken); runExp.FuncCallOnAfterExpr = funcExp; runExp.Mode = t.Token.Text; return(runExp); } return(funcExp); } // Some other token e.g. + - < etc. var funcname = Exprs.Ident(name, nameToken); var funcExp2 = Exprs.FunctionCall(funcname, null, nameToken); // Move past token _tokenIt.Advance(); return(funcExp2); //throw this.TokenIt.BuildSyntaxUnexpectedTokenException(); }