Example #1
0
        public bool CmdVar(ScriptLine line)
        {
            if (!CheckSwitchBlock())
            {
                return(false);
            }

            var var = string.Empty;

            line.Skip(" \t");
            if (!line.GetWord(ref var, "= \t"))
            {
                //Error("변수 이름이 없습니다");
                Error("no value name");
                return(false);
            }

            m_tokenMap.Set(var, TOKENTYPE.TOKENTYPE_VAR);
            if (!OnVar(line, var))
            {
                return(false);
            }
            m_asm.Commentf("int {0}", var);
            return(true);
        }
Example #2
0
        public bool CmdSwitch(ScriptLine line)
        {
            if (!CheckSwitchBlock())
            {
                return(false);
            }

            WriteCode(CODE.CODE_PUSH);
            WriteVar("$case");

            WriteCode(CODE.CODE_MOV);
            WriteVar("$case");

            if (!Value(line))
            {
                //		Error("switch에러");
                Error("switch error");
                return(false);
            }

            m_nSwitch++;
            if (m_nIf > 0)
            {
                if (m_nSwitchInIf[m_nIf] < Globals.MAX_SWITCH)
                {
                    m_nSwitchInIf[m_nIf]++;
                }
                else
                {
                    Error("too many choosemenu command in if block");
                }
            }
            return(true);
        }
Example #3
0
        public bool CmdDefine(ScriptLine line)
        {
            if (!CheckSwitchBlock())
            {
                return(false);
            }
            var name  = string.Empty;
            var data  = string.Empty;
            int isNum = 0;

            line.Skip(" \t");
            if (!line.GetWord(ref name, " \t"))
            {
                //		Error("정의어 이름이 없습니다");
                Error("no define name");
                return(false);
            }

            line.Skip(" \t");
            if (line.GetParse(ref data, '"'))
            {
                isNum = 0;
            }
            else if (!GetDefVar(line, ref data, ref isNum))
            {
                //		Error("정의 선언 값 부분에 문제가 있습니다");
                Error("problem of define value");
                return(false);
            }

            m_tokenMap.Set(name, TOKENTYPE.TOKENTYPE_DEFINE, isNum, data);

            m_asm.Commentf("define {0} {1}", name, data);
            return(true);
        }
Example #4
0
        public bool CmdDeclare(ScriptLine line)
        {
            if (!CheckSwitchBlock())
            {
                return(false);
            }

            int isNum = 0;
            var func  = string.Empty;
            var parm  = string.Empty;
            var code  = string.Empty;
            var sp    = string.Empty;

            line.Skip(" \t");
            if (!line.GetWord(ref func, " \t"))
            {
                //		Error("함수 이름이 없습니다");
                Error("no func name");
                return(false);
            }

            line.Skip(" \t");
            if (!line.GetWord(ref parm, " \t"))
            {
                //		Error("파라미터 정보가 없습니다");
                Error("no parameter info");
                return(false);
            }

            line.Skip(" \t");
            if (!GetDefVar(line, ref code, ref isNum))
            {
                //		Error("함수 코드 부분에 문제가 있습니다");
                Error("there are problem func code part");
                return(false);
            }

            line.Skip(" \t");
            line.GetWord(ref sp, " \t");

            /*
             * if (isNum != 0)
             * {
             *  //		Error("함수 코드에는 숫자만 올수 있습니다");
             *  Error("just only number at func code");
             *  return false;
             * }*/

            m_tokenMap.Set(func, TOKENTYPE.TOKENTYPE_FUNC, int.Parse(code), parm);
            m_asm.Commentf("declare {0} {1} {2}", func, parm, code);

            if (sp.Equals("blockcheck"))
            {
                m_blockCheckMap[Convert.ToInt32(code)] = true;
                m_asm.Comment("block check func");
            }

            return(true);
        }
Example #5
0
 public bool CmdDefault(ScriptLine line)
 {
     if (!CheckSwitchBlock())
     {
         return(false);
     }
     return(true);
 }
Example #6
0
 public bool CmdExitWhile(ScriptLine line)
 {
     if (!CheckSwitchBlock())
     {
         return(false);
     }
     Goto(m_whileBlock);
     return(true);
 }
Example #7
0
        public bool CmdBlockBreak(ScriptLine line)
        {
            var info = string.Empty;

            m_block.GetStrInfo(ref info);
            //	Error("현재 블럭 정보 - %s", info);
            Error("current block info - %s", info);
            return(false);
        }
Example #8
0
        public bool GetDefVar(ScriptLine line, ref string data, ref int isNum)
        {
            if (!CheckSwitchBlock())
            {
                return(false);
            }

            if (!line.GetWord(ref data, " \t+-"))
            {
                //		Error("정의 또는 숫자 정보가 없습니다");
                Error("there are no define or number");
                return(false);
            }

            if (IsNum(data))
            {
                isNum = 1;
                return(true);
            }

            TokenInfo pTokenInfo;

            if (!m_tokenMap.Get(data, out pTokenInfo))
            {
                //		Error("%s 는 정의되지 않은 토큰입니다", data);
                Error("{0} - not defined token", data);
                return(false);
            }

            data  = pTokenInfo.str;
            isNum = pTokenInfo.num;
            var op = string.Empty;

            if (line.GetOperator(ref op, "+-"))
            {
                int n = Convert.ToInt32(data);
                if (op.Equals("++"))
                {
                    n++;
                }
                else if (op.Equals("--"))
                {
                    n--;
                }
                else
                {
                    //			Error("%s 는 사용될수 없는 정의 연산자입니다", op);
                    Error("%s can not use define operater", op);
                    return(false);
                }

                pTokenInfo.str = n.ToString();
            }

            return(true);
        }
Example #9
0
        public bool CmdEnd(ScriptLine line)
        {
            if (!CheckSwitchBlock())
            {
                return(false);
            }

            WriteCode(CODE.CODE_END);
            return(true);
        }
Example #10
0
        public bool CmdBreak(ScriptLine line)
        {
            if (!CheckSwitchBlock())
            {
                return(false);
            }

            if (m_nSwitch == 1)
            {
                m_isCase = false;
            }
            return(true);
        }
Example #11
0
        public bool CmdEndIf(ScriptLine line)
        {
            if (!CheckSwitchBlock())
            {
                return(false);
            }

            if (m_nSwitchInIf[m_nIf] > 0)
            {
                Error("there are not endchoose commanded in if block!");
            }

            m_nIf--;
            return(true);
        }
Example #12
0
        public bool CmdCase(ScriptLine line)
        {
            WriteCode(CODE.CODE_CASE);
            if (!Value(line))
            {
                //		Error("case 에러");
                Error("case error");
                return(false);
            }

            m_asm.Putf("not ");
            WriteGotoBlock(m_block.GetNextId());
            m_isCase = true;
            return(true);
        }
Example #13
0
        public override bool OnCommand(ScriptLine line, CMD cmd)
        {
            switch (cmd)
            {
            case CMD.CMD_END: return(CmdEnd(line));

            case CMD.CMD_VAR: return(CmdVar(line));

            case CMD.CMD_IF: return(CmdIf(line));

            case CMD.CMD_ELSEIF: return(CmdElseIf(line));

            case CMD.CMD_ELSE: return(CmdElse(line));

            case CMD.CMD_ENDIF: return(CmdEndIf(line));

            case CMD.CMD_DECLARE: return(CmdDeclare(line));

            case CMD.CMD_DEFINE: return(CmdDefine(line));

            case CMD.CMD_SWITCH: return(CmdSwitch(line));

            case CMD.CMD_CASE: return(CmdCase(line));

            case CMD.CMD_BREAK: return(CmdBreak(line));

            case CMD.CMD_DEFAULT: return(CmdDefault(line));

            case CMD.CMD_ENDSWITCH: return(CmdEndSwitch(line));

            case CMD.CMD_DEFCMD: return(CmdDefCmd(line));

            case CMD.CMD_BLOCKBREAK: return(CmdBlockBreak(line));

            case CMD.CMD_WHILE: return(CmdWhile(line));

            case CMD.CMD_ENDWHILE: return(CmdEndWhile(line));

            case CMD.CMD_EXITWHILE: return(CmdExitWhile(line));

            default:
                //			Error("알수 없는 명령 코드 %d", cmd);
                Error("cant identify func code%d", cmd);
                break;
            }

            return(false);
        }
Example #14
0
        public bool CmdEndSwitch(ScriptLine line)
        {
            if (m_nSwitch == 0)
            {
                Error("none choosemenu commanded before");
            }

            m_nSwitch--;
            if (m_nIf > 0)
            {
                m_nSwitchInIf[m_nIf]--;
            }
            WriteCode(CODE.CODE_POP);
            WriteVar("$case");
            return(true);
        }
Example #15
0
        public bool CmdEndWhile(ScriptLine line)
        {
            if (!CheckSwitchBlock())
            {
                return(false);
            }
            if (m_whileStack.Count == 0)
            {
                //		Error("while-endwhile개수가맞지않습니다");
                Error("while - endwhile not match number");
                return(false);
            }

            m_whileBlock = m_whileStack.Pop();

            return(true);
        }
Example #16
0
        public bool CmdElseIf(ScriptLine line)
        {
            if (!CheckSwitchBlock())
            {
                return(false);
            }

            WriteCode(CODE.CODE_CMP);
            if (!Value(line))
            {
                //		Error("if 에러");
                Error("if error");
                return(false);
            }
            m_asm.Putf("not ");
            WriteGotoBlock(m_block.GetNextId());
            return(true);
        }
Example #17
0
        public bool CmdDefCmd(ScriptLine line)
        {
            if (!CheckSwitchBlock())
            {
                return(false);
            }

            var name = string.Empty;
            var data = string.Empty;

            line.Skip(" \t");
            if (!line.GetWord(ref name, " \t"))
            {
                //		Error("정의될 명령어가 없습니다");
                Error("there are no define command");
                return(false);
            }

            line.Skip(" \t");
            if (!line.GetWord(ref data, " \t"))
            {
                //		Error("기본 명령어가 없습니다");
                Error("there are no base command");
                return(false);
            }

            TokenInfo pTokenInfo;

            if (!m_tokenMap.Get(data, out pTokenInfo))
            {
                //		Error("%s 라는 명령어는 존재하지 않습니다", data);
                Error("%s not exist", data);
                return(false);
            }

            m_tokenMap.Set(name, pTokenInfo.type, pTokenInfo.num, pTokenInfo.GetStr());
            return(true);
        }
Example #18
0
        public bool CmdWhile(ScriptLine line)
        {
            if (!CheckSwitchBlock())
            {
                return(false);
            }

            m_whileStack.Push(m_whileBlock);

            WriteCode(CODE.CODE_CMP);
            if (!Value(line))
            {
                //		Error("if 에러");
                Error("if error");
                return(false);
            }

            m_asm.Putf("not ");

            m_whileBlock = m_block.GetEndId();
            WriteGotoBlock(m_whileBlock);
            return(true);
        }
Example #19
0
        public override bool OnVar(ScriptLine line, string name)
        {
            var op = string.Empty;

            line.Skip(" \t");
            if (!line.GetOperator(ref op, "=+-*/%"))
            {
                //if (!op[0]) return true;
                //Error("OnVar1: !op [{0}] ", op);
                //return false;
                return(true);
            }

            CODE code = 0;

            if (op.Equals("="))
            {
                code = CODE.CODE_MOV;
            }
            else if (op.Equals("+="))
            {
                code = CODE.CODE_ADD;
            }
            else if (op.Equals("-="))
            {
                code = CODE.CODE_SUB;
            }
            else if (op.Equals("*="))
            {
                code = CODE.CODE_MUL;
            }
            else if (op.Equals("/="))
            {
                code = CODE.CODE_DIV;
            }
            else if (op.Equals("++"))
            {
                code = CODE.CODE_INC;
            }
            else if (op.Equals("--"))
            {
                code = CODE.CODE_DEC;
            }
            else if (op.Equals("%="))
            {
                code = CODE.CODE_MOD;
            }
            else
            {
                Error("OnVar2: [{0}]  operator error1", op);
                return(false);
            }

            WriteCode(code);
            WriteVar(name);
            if (code == CODE.CODE_INC || code == CODE.CODE_DEC)
            {
                return(true);
            }
            if (!Value(line))
            {
                Error("{0} OnVar: !Value(line)", name);
                return(false);
            }
            return(true);
        }
Example #20
0
        public bool Value(ScriptLine line, bool flag = true)
        {
            var data = string.Empty;
            var op   = string.Empty;

            while (true)
            {
                line.Skip(" \t[");
                if (line.GetParse(ref data, '"'))
                {
                    if (data.Length >= 250)
                    {
                        Error("Value: 250 strlen(data) >= 250 {0}", data);
                        return(false);
                    }
                    WriteStr(data);
                }
                else if (line.GetParse(ref data, '#'))
                {
                    TokenInfo tokenInfo;
                    if (!m_tokenMap.Get(data, out tokenInfo))
                    {
                        Error("Value: [{0}]  is not in a token map - GetParse", data);
                        return(false);
                    }
                    if (tokenInfo.num > 0)
                    {
                        WriteNum(Convert.ToInt32(tokenInfo.GetStr()));
                    }
                    else
                    {
                        WriteStr(tokenInfo.GetStr());
                    }
                }
                else if (line.GetWord(ref data, "%!=+-/*&|>< \t[],"))
                {
                    if (IsNum(data))
                    {
                        WriteNum(Convert.ToInt32(data));
                    }
                    else
                    {
                        TokenInfo tokenInfo;

                        if (!m_tokenMap.Get(data, out tokenInfo))
                        {
                            Error("Value: [{0}] is not in a token map - GetWord", data);
                            return(false);
                        }
                        switch (tokenInfo.type)
                        {
                        case TOKENTYPE.TOKENTYPE_VAR:
                            WriteVar(data);
                            break;

                        case TOKENTYPE.TOKENTYPE_DEFINE:
                            if (tokenInfo.num > 0)
                            {
                                WriteNum(Convert.ToInt32(tokenInfo.GetStr()));
                            }
                            else
                            {
                                WriteStr(tokenInfo.GetStr());
                            }
                            break;

                        case TOKENTYPE.TOKENTYPE_FUNC:
                            WriteCall(data);
                            if (!OnFunc(line, tokenInfo.num, tokenInfo.GetStr()))
                            {
                                Error("Value: Func not found");
                                return(false);
                            }
                            break;

                        default:
                        {
                            //						    Error("Value: %s 토큰은 사용될수 없습니다 line:%s", data, line.GetBase());
                            Error("Value: {0} tokenInfo->type not found line:{1}", data, line.GetBase());
                            return(false);
                        }
                        }
                    }
                }
                else
                {
                    //			if (flag) Error("Value:값이 없습니다 line:%s", line.GetBase());
                    return(false);
                }

                line.Skip(" \t,");
                if (!line.GetOperator(ref op, "%=+-/*&|><!"))
                {
                    break;
                }
                if (string.IsNullOrEmpty(op))
                {
                    break;
                }

                if (!WriteOp(op))
                {
                    Error("Value: write error!");
                    return(false);
                }
            }
            line.Skip("]");
            WriteOp(";");
            return(true);
        }
Example #21
0
        public override bool OnControl(ScriptLine line, int cmd)
        {
            switch ((CMD)cmd)
            {
            case CMD.CMD_WHILE:
            case CMD.CMD_SWITCH:
            case CMD.CMD_IF:
                if (!m_block.Start(m_bin.GetPos()))
                {
                    //				Error("블럭 개수가 너무 많습니다");
                    Error("too many block number");
                    return(false);
                }
                m_asm.Commentf("block {0}-{1} id{2}  addr hex[{3}]", m_block.GetCurId() >> 8, m_block.GetCurId() & 0xff, m_block.GetCurId(), m_bin.GetPos());
                break;

            case CMD.CMD_BREAK:
                Goto(m_block.GetEndId());
                break;

            case CMD.CMD_DEFAULT:
            case CMD.CMD_CASE:
                if (!m_block.Link(m_bin.GetPos()))
                {
                    //				Error("연결된 블럭 개수가 너무 큽니다");
                    Error("too many linked block number");
                    return(false);
                }
                m_asm.Commentf("block {0}-{1} id{2}  addr hex[{3}]", m_block.GetCurId() >> 8, m_block.GetCurId() & 0xff, m_block.GetCurId(), m_bin.GetPos());
                break;

            case CMD.CMD_ELSEIF:
            case CMD.CMD_ELSE:
                Goto(m_block.GetEndId());
                if (!m_block.Link(m_bin.GetPos()))
                {
                    //				Error("연결된 블럭 개수가 너무 큽니다");
                    Error("too many linked block number");
                    return(false);
                }
                m_asm.Commentf("block {0}-{1} id{2}  addr hex[{3}]", m_block.GetCurId() >> 8, m_block.GetCurId() & 0xff, m_block.GetCurId(), m_bin.GetPos());
                break;

            case CMD.CMD_ENDWHILE:
            case CMD.CMD_ENDSWITCH:
            case CMD.CMD_ENDIF:
                if ((CMD)cmd == CMD.CMD_ENDWHILE)
                {
                    Goto(m_block.GetStartId());
                }

                if (!m_block.Link(m_bin.GetPos()))
                {
                    //				Error("연결된 블럭 개수가 너무 큽니다");
                    Error("too many linked block number");
                    return(false);
                }
                m_asm.Commentf("block {0}-{1} id{2}  addr hex[{3}]", m_block.GetCurId() >> 8, m_block.GetCurId() & 0xff, m_block.GetCurId(), m_bin.GetPos());
                m_asm.Commentf("block {0}-255 id{1}  addr hex[{2}]", m_block.GetCurId() >> 8, ((m_block.GetCurId() >> 8) << 8) | 0xff, m_bin.GetPos());
                if (!m_block.End(m_bin.GetPos()))
                {
                    //				Error("블럭 {} 개수가 맞지 않습니다");
                    Error("block {} not match number");
                    return(false);
                }
                break;
            }

            return(true);
        }