internal McallStatement(McallFunctionPrimitive theToken, VariablePrimitive var, ExpressionToken exp, ArgumentToken arg) { this.token = theToken; this.var = var; this.exp = exp; this.arg = arg; }
private static LogicalLine readMcall(TokenCollection stream) { int start = stream.Position; McallFunctionPrimitive mcall = stream.GetNextToken() as McallFunctionPrimitive; if (mcall == null) { throw new HspLogicalLineException("mcall:mcallプリミティブ以外からスタート"); } if (stream.NextIsEndOfLine) { stream.Position = start; return((LogicalLine)readCommand(stream)); } ExpressionToken exp = CodeTokenFactory.ReadExpression(stream); if (exp.CanRpnConvert) //RPN変換ができるなら普通の関数として扱う。 { stream.Position = start; return((LogicalLine)readCommand(stream)); } stream.Position = start; stream.GetNextToken(); VariablePrimitive var = stream.GetNextToken() as VariablePrimitive; if (var == null) { throw new HspLogicalLineException("mcall行:変換不能な形式"); } if (stream.NextIsBracketStart) //mcall の記法は配列変数を認めない { throw new HspLogicalLineException("mcall行:変換不能な形式"); } if (stream.NextIsEndOfLine) { throw new HspLogicalLineException("mcall行:変換不能な形式"); } exp = CodeTokenFactory.ReadExpression(stream); if (stream.NextIsEndOfLine) { return(new McallStatement(mcall, var, exp, null)); } ArgumentToken arg = CodeTokenFactory.ReadArgument(stream); if (stream.NextIsEndOfLine) { return(new McallStatement(mcall, var, exp, arg)); } throw new HspLogicalLineException("mcall行:余分なトークンがある"); }