// Arguments = "(" [Expression { COMMA Expression }] ")" private List <Expression> Arguments() { int pos = S.Pos; List <Expression> args = new List <Expression>(); if (S.Token == LPAREN) { S.NextToken(); if (S.Token != RPAREN) { args.Add(GetExpression()); while (S.Token == COMMA) { S.NextToken(); args.Add(GetExpression()); } } Accept(RPAREN); } else { throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString); } return(args); }
public void Accept(int token) { if (token == SEMI) // ; 处理,可以不加; { if (S.Token == token) { S.NextToken(); } return; } if (S.Token == token) { S.NextToken(); } else { throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString); } }
private bool FormalParameter() { if (S.Token == IDENTIFIER) //标识符 { Instructor.CompileIndexStack.AddSymbolVar(S.TokenString); S.NextToken(); return(false); } else if (S.Token == UntPar) { Instructor.CompileIndexStack.AddSymbolVar("args"); S.NextToken(); return(true); } else { throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString); } }
private Expression Term3() { Expression t = null; switch (S.Token) { case PLUSPLUS: // 例如 ++i S.NextToken(); t = Term3(); t = E.At(S.Pos).PosInc(t, true); break; case SUBSUB: // 例如 --i S.NextToken(); t = Term3(); t = E.At(S.Pos).PosDec(t, true); break; case THIS: S.NextToken(); if (S.Token == EQ) { throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString); } t = E.At(S.Pos).GetThisValue(); break; case FALSE: Contract.Assert(S.TokenString == "false"); t = E.At(S.Pos).Flase(); S.NextToken(); break; case TRUE: Contract.Assert(S.TokenString == "true"); t = E.At(S.Pos).True(); S.NextToken(); break; case NUMBER: //数字 t = E.At(S.Pos).Number(S.TokenString); S.NextToken(); break; case STRINGLITERAL: //字符串 t = E.At(S.Pos).String(S.TokenString); S.NextToken(); break; case FUNCTION: //函数 S.NextToken(); t = MethodDeclaratorRest(); break; case LBRACE: t = TableInitializer(t); break; case IDENTIFIER: string ident = Ident(); if (S.Token == EQ) { mode = LValue; S.NextToken(); if (S.Token != Nil) { t = E.At(S.Pos).Select(t, ident, true); } else { t = E.At(S.Pos).Remove(t, ident); mode = EXPR; } } else { t = E.At(S.Pos).Select(t, ident, false); if (S.Token == LPAREN) { t = Arguments(t); } } break; default: throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString); } while (true) { if (S.Token == DOT) { S.NextToken(); string ident = Ident(); if (S.Token == EQ) { mode = LValue; S.NextToken(); if (S.Token != Nil) { t = E.At(S.Pos).Select(t, ident, true); } else { t = E.At(S.Pos).Remove(t, ident); mode = EXPR; } } else if (S.Token == LPAREN) { Expression own = t; t = E.At(S.Pos).Select(t, ident, false); t = Arguments(own, t); } else { t = E.At(S.Pos).Select(t, ident, false); } } else if (S.Token == LPAREN) // ( { t = Arguments(t); } else if (S.Token == LBRACKET) // [ { S.NextToken(); Expression t1 = Term(); Accept(RBRACKET); if (S.Token == EQ) { mode = LValue; S.NextToken(); if (S.Token != Nil) { t = E.At(S.Pos).Select(t, t1, true); } else { t = E.At(S.Pos).Remove(t, t1); mode = EXPR; } } else if (S.Token == LPAREN) { Expression own = t; t = E.At(S.Pos).Select(t, t1, false); t = Arguments(own, t); } else { t = E.At(S.Pos).Select(t, t1, false); } } else { break; } } while ((S.Token == PLUSPLUS || S.Token == SUBSUB) && (mode & EXPR) != 0) { mode = EXPR; // t = E.At(S.Pos).Unary(S.Token == PLUSPLUS ? Tree.POSTINC : Tree.POSTDEC, t); if (S.Token == PLUSPLUS) // 后加 例如 i++; { t = E.At(S.Pos).PosInc(t, false); } else { t = E.At(S.Pos).PosDec(t, false); } S.NextToken(); } return(t); }
private Expression Statement() { switch (S.Token) { case LBRACE: return(Block()); case IF: { S.NextToken(); Expression cond = ParExpression(); Expression thenpart = Statement(); Expression elsepart = null; if (S.Token == ELSE) { S.NextToken(); elsepart = Statement(); } return(E.At(S.Pos).IfThenElse(cond, thenpart, elsepart)); } case FOR: { S.NextToken(); Accept(LPAREN); Expression inits = S.Token == SEMI?Expression.Empty() : GetExpression(); Accept(SEMI); Expression cond = S.Token == SEMI?Expression.Empty() : GetExpression(); Accept(SEMI); Expression steps = S.Token == RPAREN?Expression.Empty() : GetExpression(); Accept(RPAREN); loopLabelStack.Push(Expression.Label()); Expression body = Statement(); return(E.At(S.Pos).ForLoop(inits, cond, steps, body, loopLabelStack.Pop())); } case WHILE: { S.NextToken(); Expression cond = ParExpression(); loopLabelStack.Push(Expression.Label()); Expression body = Statement(); Expression t = E.At(S.Pos).WhileLoop(cond, body, loopLabelStack.Pop()); return(t); } case DO: { S.NextToken(); loopLabelStack.Push(Expression.Label()); Expression body = Statement(); Accept(WHILE); Expression cond = ParExpression(); Expression t = E.At(S.Pos).DoWhileLoop(body, cond, loopLabelStack.Pop()); return(t); } case BREAK: { S.NextToken(); //应该先判断是否Peek()为空,以后在处理 Expression t = E.At(S.Pos).Break(loopLabelStack.Peek()); Accept(SEMI); return(t); } case RETURN: { S.NextToken(); Expression result = S.Token == SEMI ? null : VariableInitializer(); //应该先判断是否Peek()为空,以后在处理 Expression t = E.At(S.Pos).Return(funcReturnStack.Peek(), result); Accept(SEMI); return(t); } case ELSE: { throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString); } default: { Expression t = GetExpression(); Accept(SEMI); return(t); } } }
//c private BlockExpression BlockStatements() { List <Expression> stats = new List <Expression>(); while (true) { switch (S.Token) // } { case RBRACE: // } case EOF: return(Expression.Block(stats)); case LBRACE: // { case IF: // if case FOR: // for case WHILE: // while case DO: // do case RETURN: //return case BREAK: //break; case CONTINUE: stats.Add(Statement()); break; case LOCAL: S.NextToken(); if (S.Token == IDENTIFIER) { stats.Add(VariableDeclaratorsRest(Ident())); } else if (S.Token == FUNCTION) { S.NextToken(); stats.Add(E.At(S.Pos).LocalVarDef(Ident(), MethodDeclaratorRest())); } else { throw ScriptCompileException.CreateSyntaxError(S.Line, S.Col, S.Token, S.TokenString); } Accept(SEMI); break; case FUNCTION: S.NextToken(); functionList.Add(E.At(S.Pos).MethodDef(Ident(), MethodDeclaratorRest())); break; default: Expression t = Term(EXPR | TYPE); Contract.Assert(t != null); stats.Add(t); Accept(SEMI); break; } } }