/// <summary> /// Exit a parse tree produced by the <c>Directiva</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 ExitDirectiva([NotNull] SicAsmParser.DirectivaContext context) { }
/* Coincidencias con las Directivas */ public override string VisitDirectiva([NotNull] SicAsmParser.DirectivaContext context) { string label = "----"; 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."); } id = value_int.ToString("X2"); increment = 1; } 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); _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); }
/// <summary> /// Visit a parse tree produced by the <c>Directiva</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 VisitDirectiva([NotNull] SicAsmParser.DirectivaContext context) { return(VisitChildren(context)); }