Esempio n. 1
0
        public static void FormSentenceTable()
        {
            Mnem = "";
            NameOrLabelNumber = 0;
            MnemNumber        = 0;
            Type = TableAsmWords.Types.пусто;

            for (int k = 0; k < 6; k++)
            {
                for (int l = 0; l < 2; l++)
                {
                    Operands[k, l] = 0;
                }
            }

            TableSentence.Item = null; //Обнуляем таблицу предложения в начале строки
            TableSentence.Table.Clear();
            TableOperand.ReCreate();   //Обнуляем таблицы операндов в начале строки

            foreach (var lexem in TableLexeme.Items)
            {
                if (lexem.AsmWord() != null)
                {
                    if ((lexem.Type == TableAsmWords.Types.інструкція) ||
                        (lexem.Type == TableAsmWords.Types.директива))
                    {
                        MnemNumber = lexem.Number;
                        Mnem       = lexem.Name;
                        if (MnemNumber > 1)//mnem not first
                        {
                            NameOrLabelNumber = 1;
                        }
                        Type = lexem.Type;
                    }
                }
            }
            switch (MnemNumber)
            {
            case 0:                                   //label only possible
                if (TableLexeme.Items[0].Type == TableAsmWords.Types.користувач &&
                    TableLexeme.Items[1].Name == ":") //it IS label
                {
                    NameOrLabelNumber = 1;
                    Mnem = TableLexeme.Items[0].Name;
                    Type = TableAsmWords.Types.мітка;
                }
                else
                {
                    Errors.Add(5);    //@error хз шо не удалось определить конструкцию
                }
                IsComa = false;
                break;

            case 1:    //команда
                IsComa = true;
                break;

            case 2:                                                              //директива
                if (TableLexeme.Items[0].Type == TableAsmWords.Types.користувач) //имя на своём месте
                {
                    IsComa = true;
                }
                else
                {
                    Errors.Add(5);    //@error хз шо не удалось определить конструкцию
                }
                break;

            case 3:                                   //команда с меткой в одной строке
                if (TableLexeme.Items[0].Type == TableAsmWords.Types.користувач &&
                    TableLexeme.Items[1].Name == ":") //there IS label
                {
                    IsComa = true;
                }
                else
                {
                    Errors.Add(5);    //@error хз шо не удалось определить конструкцию
                }
                break;

            default:
                Errors.Add(5);    //@error хз шо не удалось определить конструкцию
                break;
            }

            if (MnemNumber < TableLexeme.Count && Mnem != "LABEL" && IsComa)//mnem has operands
            {
                ReadOperands();
            }

            new TableSentence(Mnem, NameOrLabelNumber, MnemNumber, Operands, Type);
        }
Esempio n. 2
0
        private static string CreateLexemeTable(string Lexeme, int count, int iter)
        {
            char[] Chars = new char[225];

            for (int i = 0; i < iter; i++)
            {
                if (i == 1)
                {
                    count = 1;
                }

                Lexeme.CopyTo(0, Chars, 0, count);
                Lexeme = Lexeme.Remove(0, count);
                string CurrentLexeme = new string(Chars);
                CurrentLexeme = CurrentLexeme.Trim(new Char[] { '\0' });
                Array.Clear(Chars, 0, Chars.Length);

                if (CurrentLexeme == "")
                {
                    continue;//проверка на две односимвольные подряд
                }
                TableAsmWords Word = TableAsmWords.GetByName(CurrentLexeme.ToUpper());
                if (Word != null)//мы знаем эту лексему
                {
                    new TableLexeme(Word.Name, Word.Description, Word.Type);
                }
                else
                {
                    string ConstDescript          = ConstOrUser(CurrentLexeme);
                    TableAsmWords.Types ConstType = TableAsmWords.Types.пусто;
                    switch (ConstDescript)
                    {
                    case "Помилка":
                        ConstType = TableAsmWords.Types.помилка;
                        Errors.Add(1);    //@error недопустимые символы в лексеме
                        break;

                    case "Текстова константа":
                        CurrentLexeme = CurrentLexeme.Remove(0, 1);
                        CurrentLexeme = CurrentLexeme.Remove(CurrentLexeme.Length - 1, 1);
                        ConstType     = TableAsmWords.Types.текст;
                        break;

                    case "Ідентифікатор користувача або невизначений":
                        CurrentLexeme = CurrentLexeme.ToUpper();
                        ConstType     = TableAsmWords.Types.користувач;
                        if (CurrentLexeme.Length > 8)
                        {
                            Errors.Add(3);    //@error Ідентифікатор довший за 8 символів
                        }
                        break;

                    default:
                        CurrentLexeme = CurrentLexeme.ToUpper();
                        ConstType     = TableAsmWords.Types.число;
                        break;
                    }
                    new TableLexeme(CurrentLexeme, ConstDescript, ConstType);
                }
            }
            return(Lexeme);
        }
Esempio n. 3
0
        public static void DoOperands()//обробка операндів
        {
            string mnemName = TableSentence.Item.Mnem;
            int    opCount;

            if (TableInstruction.GetByName(mnemName) != null)//у директиви або інструкції є операнди
            {
                opCount = TableInstruction.GetByName(mnemName).OperandCount;
            }
            else//інші директиви
            {
                opCount = 0;
            }

            if (mnemName != "ASSUME" && opCount != TableSentence.Item.OpCount)
            {
                Errors.Add(6);//@error Невірна кількість операндів
            }
            else
            {
                for (int i = 0; i < TableSentence.Item.OpCount; i++)//для каждого операнда
                {
                    isFirst = (i == 0) ? true : false;
                    int j = 0;
                    while (j < TableSentence.Item.Operands[i, 1])
                    {
                        TableLexeme Lexeme = TableLexeme.GetByNumber(TableSentence.Item.Operands[i, 0] + j);
                        switch (Lexeme.Type)
                        {
                        case TableAsmWords.Types.регістр:
                            DoOpRegister(Lexeme);
                            break;

                        case TableAsmWords.Types.сегментний_регістр:
                            DoOpSegRegister(Lexeme);
                            break;

                        case TableAsmWords.Types.тип:
                            DoOpType(Lexeme);
                            break;

                        case TableAsmWords.Types.користувач:
                            DoOpName(Lexeme);
                            break;

                        case TableAsmWords.Types.символ:
                            j += DoOpSymbols(Lexeme);
                            break;

                        case TableAsmWords.Types.seg:
                            DoOpSeg(Lexeme);
                            break;

                        case TableAsmWords.Types.число:
                            j += DoOpConst();
                            break;

                        case TableAsmWords.Types.текст:
                            DoOpText();
                            break;

                        default:
                            break;
                        }
                        j++;
                    }
                    TableOperand.IdentifyOperands(isFirst);
                }
            }
            bool result = opCount > 0 ? TableOperand.VerifyOperands(mnemName) : true;

            if (!result)
            {
                Errors.Add(15);//@error Помилкові операнди
            }
        }