コード例 #1
0
        public override object VisitDirByteHex([NotNull] StdAssemblerParser.DirByteHexContext context)
        {
            string   value;
            StdToken token;

            if (context.children.Count != 5)
            {
                throw new Exception("Error de sintáxis: Instrucción no válida");
            }
            else
            {
                value = context.VAL().GetText();
                if (!Regex.IsMatch(value, @"^[0-9A-F]+$"))
                {
                    throw new Exception("Error de sintáxis: ingrese un valor hexadecimal");
                }
                token = new StdToken()
                {
                    Address       = count,
                    IsDirective   = true,
                    IsHex         = true,
                    Mode          = false,
                    OperationCode = "BYTE",
                    Value         = value
                };
                count += int.Parse(Math.Ceiling((double)value.Length / 2).ToString());
                return(token);
            }
        }
コード例 #2
0
        public override object VisitDirWord([NotNull] StdAssemblerParser.DirWordContext context)
        {
            string   value;
            StdToken token;

            if (context.children.Count != 2)
            {
                throw new Exception("Error de sintáxis: Instrucción no válida");
            }
            else
            {
                value = context.VAL().GetText();
                if (Regex.IsMatch(value, @"(H|h)"))
                {
                    if (!Regex.IsMatch(value, @"^[0-9A-F]+(H|h)$"))
                    {
                        throw new Exception("Error de sintáxis: ingrese una dirección hexadecimal");
                    }

                    token = new StdToken()
                    {
                        Address       = count,
                        IsDirective   = true,
                        IsHex         = true,
                        Mode          = false,
                        OperationCode = "WORD",
                        Value         = value
                    };
                    count += 3;
                    return(token);
                }
                else
                {
                    if (Regex.IsMatch(value, "^[0-9]+$"))
                    {
                        value = int.Parse(value).ToString("X");
                        token = new StdToken()
                        {
                            Address       = count,
                            IsDirective   = true,
                            IsHex         = false,
                            Mode          = false,
                            OperationCode = "WORD",
                            Value         = value
                        };
                        count += 3;
                        return(token);
                    }
                    else
                    {
                        throw new Exception("Error de sintáxis: Instrucción no válida");
                    }
                }
            }
        }
コード例 #3
0
        public override object VisitDirResw([NotNull] StdAssemblerParser.DirReswContext context)
        {
            string   value;
            StdToken token;

            if (context.children.Count != 2)
            {
                throw new Exception("Error de sintáxis: Instrucción no válida");
            }
            else
            {
                value = context.VAL().GetText();
                if (Regex.IsMatch(value, @"(H|h)"))
                {
                    if (!Regex.IsMatch(value, @"^[0-9A-F]+(H|h)$"))
                    {
                        throw new Exception("Error de sintáxis: ingrese una dirección hexadecimal");
                    }

                    token = new StdToken()
                    {
                        Address       = count,
                        IsDirective   = true,
                        IsHex         = true,
                        Mode          = false,
                        OperationCode = "RESW",
                        Value         = value
                    };
                    count += int.Parse(Regex.Replace(value, @"(H|h)", ""), System.Globalization.NumberStyles.HexNumber) * 3;
                    return(token);
                }
                else
                {
                    if (Regex.IsMatch(value, "^[0-9]+$"))
                    {
                        token = new StdToken()
                        {
                            Address       = count,
                            IsDirective   = true,
                            IsHex         = false,
                            Mode          = false,
                            OperationCode = "RESW",
                            Value         = value
                        };
                        count += int.Parse(value) * 3;
                        return(token);
                    }
                    else
                    {
                        throw new Exception("Error de sintáxis: Instrucción no válida");
                    }
                }
            }
        }
コード例 #4
0
        public override object VisitRSub([NotNull] StdAssemblerParser.RSubContext context)
        {
            StdToken token;
            string   codOp;

            codOp = context.RSUB().GetText();
            token = new StdToken()
            {
                Address       = count,
                IsHex         = false,
                IsDirective   = false,
                Mode          = false,
                OperationCode = "RSUB"
            };
            return(token);
        }
コード例 #5
0
        public override object VisitDirByteChar([NotNull] StdAssemblerParser.DirByteCharContext context)
        {
            string   ascii;
            StdToken token;


            {
                ascii = Regex.Match(context.start.InputStream.ToString(), @"\'([\x00-\xFF])+\'").Value.Replace("'", "");
                token = new StdToken()
                {
                    Address       = count,
                    IsDirective   = true,
                    IsHex         = false,
                    Mode          = false,
                    OperationCode = "BYTE",
                    Value         = ascii
                };
                count += ascii.Length;
                return(token);
            }
        }
コード例 #6
0
        public override object VisitFin([NotNull] StdAssemblerParser.FinContext context)
        {
            string   end, inicio;
            StdToken token;

            if (context.children.Count > 3)
            {
                throw new Exception("Error de sintáxis: Instrucción no válida");
            }
            else
            {
                end = context.END().GetText();
                if (context.etiquetaFin() != null)
                {
                    inicio = Visit(context.etiquetaFin()) as String;
                }
                else
                {
                    inicio = string.Empty;
                }
                if (end.Contains("missing"))
                {
                    throw new Exception("Error de sintáxis: Instrucción no válida");
                }
            }
            token = new StdToken()
            {
                Address       = count,
                IsDirective   = true,
                IsHex         = false,
                Mode          = false,
                OperationCode = "END",
                Value         = inicio
            };
            TokenList.Add(token);
            return(token);
        }
コード例 #7
0
        public override object VisitCodOp([NotNull] StdAssemblerParser.CodOpContext context)
        {
            string   codOp, etiqueta;
            StdToken token;
            Boolean  index = false;

            codOp    = context.CODOP().GetText();
            etiqueta = Visit(context.etiqueta()) as String;
            if (context.COMA() != null && context.HEX() != null)
            {
                index = true;
            }

            token = new StdToken()
            {
                Address       = count,
                IsDirective   = false,
                IsHex         = false,
                Mode          = index,
                OperationCode = codOp,
                Symbol        = etiqueta
            };
            return(token);
        }
コード例 #8
0
        public override object VisitInicio([NotNull] StdAssemblerParser.InicioContext context)
        {
            string   etiqueta, start, dir;
            StdToken token;

            etiqueta = string.Empty;
            if (context.etiqueta() != null)
            {
                if (context.children.Count > 4)
                {
                    throw new Exception("Error de sintáxis: Instrucción no válida");
                }
                else
                {
                    etiqueta = Visit(context.etiqueta()) as String;
                    start    = context.START().GetText();
                    dir      = context.VAL().GetText();
                    if (!Regex.IsMatch(dir, @"^[0-9A-F]{4}(H|h)$"))
                    {
                        throw new Exception("Error de sintáxis: ingrese una dirección hexadecimal");
                    }
                    if (start.Contains("missing") || dir.Contains("missing"))
                    {
                        throw new Exception("Error de sintáxis: Instrucción no válida");
                    }
                    count = int.Parse(Regex.Replace(dir, "(H|h)", ""), System.Globalization.NumberStyles.HexNumber);
                }
            }
            else
            {
                if (context.children.Count > 3)
                {
                    throw new Exception("Error de sintáxis: Instrucción no válida");
                }
                else
                {
                    start = context.START().GetText();
                    dir   = context.VAL().GetText();
                    if (!Regex.IsMatch(dir, @"^[0-9A-F]{4}(H|h)$"))
                    {
                        throw new Exception("Error de sintáxis: ingrese una dirección hexadecimal");
                    }
                    if (start.Contains("missing") || dir.Contains("missing"))
                    {
                        throw new Exception("Error de sintáxis: Instrucción no válida");
                    }
                    count = int.Parse(Regex.Replace(dir, @"(H|h)", ""), System.Globalization.NumberStyles.HexNumber);
                }
            }
            token = new StdToken()
            {
                Address       = count,
                IsDirective   = true,
                IsHex         = true,
                Label         = etiqueta,
                Mode          = false,
                OperationCode = "START",
                Value         = dir
            };
            TokenList.Add(token);
            return(token);
        }
コード例 #9
0
        public override object VisitLinea(StdAssemblerParser.LineaContext context)
        {
            StdToken token;

            try
            {
                if (context.exception != null)
                {
                    throw new Exception("Error de sintáxis: Instrucción no válida");
                }
                if (context.inicio() != null)
                {
                    return(Visit(context.inicio()));
                }
                else if (context.proposiciones() != null)
                {
                    return(Visit(context.proposiciones()));
                }
                else if (context.fin() != null)
                {
                    return(Visit(context.fin()));
                }
                else if (context.NL() != null)
                {
                    token = new StdToken()
                    {
                        IsEmpty = true
                    };
                    TokenList.Add(token);
                    return(token);
                }
                else
                {
                    token = new StdToken()
                    {
                        Address      = count,
                        StepOneError = "Error de sintáxis: Instrucción no válida"
                    };
                    TokenList.Add(token);
                    return(token);
                }
            }
            catch (NullReferenceException)
            {
                token = new StdToken()
                {
                    Address      = count,
                    StepOneError = "Error de sintáxis: Instrucción no válida",
                };
                TokenList.Add(token);
                return(token);
            }
            catch (Exception ex)
            {
                token = new StdToken()
                {
                    Address      = count,
                    StepOneError = ex.Message
                };
                TokenList.Add(token);
                return(token);
            }
        }