Пример #1
0
 /// <summary>
 /// Exit a parse tree produced by the <c>DirectivaCompleta</c>
 /// labeled alternative in <see cref="SicAsmParser.inst"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitDirectivaCompleta([NotNull] SicAsmParser.DirectivaCompletaContext context)
 {
 }
Пример #2
0
        public override string VisitDirectivaCompleta([NotNull] SicAsmParser.DirectivaCompletaContext context)
        {
            string label = "----";

            label = context.LABEL().GetText();
            string dir       = context.directive.Text;
            string id        = "";
            int    cp        = _program_counter;
            int    increment = 0;

            switch (context.num_type.Type)
            {
            case SicAsmParser.CONSTCAD:
                id = context.CONSTCAD().GetText();
                if (dir == "BYTE")
                {
                    increment = id.Length - 3;
                }
                else
                {
                    return("Error: las constantes solo son para la directiva BYTE.");
                }
                id = id.Remove(0, 2);
                id = id.Remove(id.Length - 1);
                /*Convertir a codigo ascii*/
                string ascii = "";
                for (int i = 0; i < id.Length; i++)
                {
                    ascii += ((int)id[i]).ToString("X2");
                }
                id = ascii;
                break;

            case SicAsmParser.CONSTHEX:

                id = context.CONSTHEX().GetText();
                if (dir == "BYTE")
                {
                    int n_chars = id.Length - 3;
                    increment = (n_chars + (n_chars % 2)) / 2;
                }
                else
                {
                    return("Error: las constantes solo son para la directiva BYTE.");
                }

                id = id.Remove(0, 2);
                id = id.Remove(id.Length - 1);
                if (id.Length % 2 != 0)
                {
                    id = id.Insert(0, "0");
                }

                break;

            case SicAsmParser.INT:
                id = context.INT().GetText();
                uint value_int = uint.Parse(id);

                if (dir == "BYTE")
                {
                    if (value_int > 0xFF)
                    {
                        return("Error: El valor de la directiva BYTE esta fuera de rango.");
                    }
                    increment = 1;
                    id        = value_int.ToString("X2");
                }
                else
                if (dir == "WORD")
                {
                    if (value_int > 0xFFFFFF)
                    {
                        return("Error: El valor de la directiva WORD esta fuera de rango.");
                    }
                    increment = 3;
                    id        = value_int.ToString("X6");
                }
                else
                if (dir == "RESB")
                {
                    if (value_int > 0x7FFF)
                    {
                        return("Error: El valor de la directiva RESB esta fuera de rango.");
                    }
                    increment = (int)value_int;
                    id        = "------";
                }
                else
                if (dir == "RESW")
                {
                    if (value_int * 3 > 0x7FFF)
                    {
                        return("Error: El valor de la directiva RESB esta fuera de rango.");
                    }
                    increment = (int)value_int * 3;
                    id        = "------";
                }
                break;

            case SicAsmParser.HEX:
                string hex_str = context.HEX().GetText().Remove(context.HEX().GetText().Length - 1);
                uint   value   = uint.Parse(hex_str, System.Globalization.NumberStyles.HexNumber);

                if (dir == "BYTE")
                {
                    if (value > 0xFF)
                    {
                        return("Error: El valor de la directiva BYTE esta fuera de rango.");
                    }
                    increment = 1;
                    id        = value.ToString("X2");
                }
                else
                if (dir == "WORD")
                {
                    if (value > 0xFFFFFF)
                    {
                        return("Error: El valor de la directiva WORD esta fuera de rango.");
                    }
                    increment = 3;
                    id        = value.ToString("X6");
                }
                else
                if (dir == "RESB")
                {
                    if (value > 0x7FFF)
                    {
                        return("Error: El valor de la directiva RESB esta fuera de rango.");
                    }
                    increment = (int)value;
                    id        = "------";
                }
                else
                if (dir == "RESW")
                {
                    if ((value * 3) > 0x7FFF)
                    {
                        return("Error: El valor de la directiva RESW esta fuera de rango.");
                    }
                    increment = (int)value * 3;
                    id        = "------";
                }
                break;
            }

            /* Si es la primera pasada */
            if (_is_first_pass)
            {
                _lines_pc.Add(_line_count + 1, _program_counter);
                if (!_symtab.ContainsKey(label))
                {
                    _symtab.Add(label, _program_counter);
                }
                else
                {
                    _program_counter += increment;
                    return("Error: símbolo \"" + label + "\" ya está definido.");
                }
                _program_counter += increment;
            }
            else /* Si es la segunda pasada */
            {
                _lines_opcode.Add(_line_count + 1, id);
            }
            return("PC= " + cp + " LABEL=" + label + " OPCODE=" + dir + " ID=" + id);
        }
Пример #3
0
 /// <summary>
 /// Visit a parse tree produced by the <c>DirectivaCompleta</c>
 /// labeled alternative in <see cref="SicAsmParser.inst"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitDirectivaCompleta([NotNull] SicAsmParser.DirectivaCompletaContext context)
 {
     return(VisitChildren(context));
 }