Пример #1
0
        public TableSentence(string mnem, int nameNum, int mnemNum, int[,] opers, TableAsmWords.Types type)
        {
            Type = type;
            Mnem = mnem;
            NameOrLabelNumber = nameNum;
            MnemNumber        = mnemNum;
            for (int k = 0; k < 6; k++)
            {
                for (int l = 0; l < 2; l++)
                {
                    Operands[k, l] = opers[k, l];
                }
            }

            Item = this;

            if (Table.Rows.Count <= 0)
            {
                Table.Rows.Add(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
            }
            Table.Rows[0][0] = NameOrLabelNumber;
            Table.Rows[0][1] = MnemNumber;
            for (int p = 0; p < 6; p++)
            {
                Table.Rows[0][p * 2 + 2] = Operands[p, 0];
                Table.Rows[0][p * 2 + 3] = Operands[p, 1];
            }
        }
Пример #2
0
 public TableLexeme(string name, string desc, TableAsmWords.Types type)
 {
     Number      = Count + 1;
     Name        = name;
     Length      = name.Length;
     Description = desc;
     Type        = type;
     Items.Add(this);
     Table.Rows.Add(Count, name, name.Length, desc, type);
 }
Пример #3
0
        public TableAsmWords.Types Type; //короткое описание

        #endregion Fields

        #region Constructors

        public TableLexeme(string name, string desc, TableAsmWords.Types type)
        {
            Number = Count + 1;
            Name = name;
            Length = name.Length;
            Description = desc;
            Type = type;
            Items.Add(this);
            Table.Rows.Add(Count, name, name.Length, desc, type);
        }
Пример #4
0
        public TableAsmWords.Types Type = TableAsmWords.Types.пусто; //тип предложения

        #endregion Fields

        #region Constructors

        public TableSentence(string mnem, int nameNum, int mnemNum, int[,] opers, TableAsmWords.Types type)
        {
            Type = type;
            Mnem = mnem;
            NameOrLabelNumber = nameNum;
            MnemNumber = mnemNum;
            for (int k = 0; k < 6; k++)
                for (int l = 0; l < 2; l++)
                    Operands[k, l] = opers[k, l];

            Item = this;

            if (Table.Rows.Count <= 0)
                Table.Rows.Add(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
            Table.Rows[0][0] = NameOrLabelNumber;
            Table.Rows[0][1] = MnemNumber;
            for (int p = 0; p < 6; p++)
            {
                Table.Rows[0][p * 2 + 2] = Operands[p, 0];
                Table.Rows[0][p * 2 + 3] = Operands[p, 1];
            }
        }
Пример #5
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);
        }
Пример #6
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);
        }
Пример #7
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);
        }