Пример #1
0
        /// <summary>
        /// 代入行
        /// </summary>
        /// <param defaultName="primitives"></param>
        /// <returns></returns>
        private static Assignment readAssignment(TokenCollection stream)
        {
            //変数を読む。失敗したら代入行じゃない。
            VariableToken token = CodeTokenFactory.ReadVariable(stream);

            //演算子を読む。失敗するなら代入行じゃない。
            if (stream.NextIsEndOfLine)
            {
                throw new HspLogicalLineException("代入行:演算子なし");
            }
            OperatorToken op = CodeTokenFactory.ReadOperator(stream);

            //式が続かないこともある。"x++"とか
            if (stream.NextIsEndOfLine)
            {
                return(new Assignment(token, op));
            }
            else
            {
                //引数を読む。あまりが出なければOK
                ArgumentToken arg = CodeTokenFactory.ReadArgument(stream);
                if (stream.NextIsEndOfLine)
                {
                    return(new Assignment(token, op, arg));
                }
            }
            throw new HspLogicalLineException("代入行:余分なトークンがある");
        }
Пример #2
0
        /// <summary>
        /// If,elseステートメントの開始
        /// </summary>
        /// <param defaultName="primitives"></param>
        /// <returns></returns>
        private static IfStatement readIf(TokenCollection stream)
        {
            IfStatementPrimitive token = stream.GetNextToken() as IfStatementPrimitive;

            if (token == null)
            {
                throw new HspLogicalLineException("条件分岐行:条件分岐プリミティブ以外からスタート");
            }

            //elseには式がない。
            if (stream.NextIsEndOfLine)
            {
                return(new IfStatement(token));
            }
            else
            {
                //式を読む。あまりが出なければOK
                ArgumentToken arg = CodeTokenFactory.ReadArgument(stream);
                if (stream.NextIsEndOfLine)
                {
                    return(new IfStatement(token, arg));
                }
            }
            throw new HspLogicalLineException("条件分岐行:余分なトークンがある");
        }
Пример #3
0
        private static OnStatement readOn(TokenCollection stream)
        {
            OnFunctionPrimitive token = stream.GetNextToken() as OnFunctionPrimitive;

            if (token == null)
            {
                throw new HspLogicalLineException("on条件分岐行:条件分岐プリミティブ以外からスタート");
            }
            //式がないこともあるかもしれない(実行時エラー)
            if (stream.NextIsEndOfLine)
            {
                return(new OnStatement(token, null, null));
            }
            //式を読む。goto/gosubがないこともあるかもしれない(実行時エラー)
            ExpressionToken exp = CodeTokenFactory.ReadExpression(stream);

            if (stream.NextIsEndOfLine)
            {
                return(new OnStatement(token, exp, null));
            }
            //goto/gosub関数を読む。goto/gosub以外でもコンパイルは通る(実行時エラー)
            //この関数には()がつかない。
            FunctionToken func = CodeTokenFactory.ReadFunction(stream, false);

            if (stream.NextIsEndOfLine)
            {
                return(new OnStatement(token, exp, func));
            }
            //まだあまってたらエラーね。
            throw new HspLogicalLineException("on条件分岐行:余分なトークンがある");
        }
Пример #4
0
        /// <summary>
        /// 命令行
        /// </summary>
        /// <param defaultName="primitives"></param>
        /// <returns></returns>
        private static Command readCommand(TokenCollection stream)
        {
            //実態はCodeTokenFactoryに任せる
            //命令には(関数と違って)括弧はいらない
            FunctionToken func = CodeTokenFactory.ReadFunction(stream, false);

            if (stream.NextIsEndOfLine)
            {
                return(new Command(func));
            }
            throw new HspLogicalLineException("命令行:余分なトークンがある");
        }
Пример #5
0
        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行:余分なトークンがある");
        }