/// <summary> /// Exit a parse tree produced by the <c>InstruccionCompleta</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 ExitInstruccionCompleta([NotNull] SicAsmParser.InstruccionCompletaContext context) { }
public override string VisitInstruccionCompleta([NotNull] SicAsmParser.InstruccionCompletaContext context) { string addr_mode = "D"; string label = "----"; string inst = ""; string id = ""; int cp = _program_counter; int addr_value = 0; String opcode; label = context.LABEL(0).GetText(); inst = context.opcode.Text; opcode = (string)_opcodes[inst]; if (_first_inst_addr == -1) { _first_inst_addr = cp; } switch (context.num_type.Type) { case SicAsmParser.LABEL: id = context.LABEL(1).GetText(); /*Si es segunda pasada...*/ if (!_is_first_pass) { if (_symtab.ContainsKey(id)) { addr_value = (int)_symtab[id]; } else { addr_value = MAX_ADDR; _lines_opcode.Add(_line_count + 1, opcode + addr_value.ToString("X4")); return("Error: símbolo \"" + id + "\" No definido"); } } break; case SicAsmParser.HEX: string hex_str = context.HEX().GetText().Remove(context.HEX().GetText().Length - 1); id = "" + int.Parse(hex_str, System.Globalization.NumberStyles.HexNumber); addr_value = int.Parse(hex_str, System.Globalization.NumberStyles.HexNumber); break; case SicAsmParser.INT: id = context.INT().GetText(); addr_value = int.Parse(id); break; } if (_is_first_pass) { _lines_pc.Add(_line_count + 1, _program_counter); if (!_symtab.ContainsKey(label)) { _symtab.Add(label, _program_counter); } else { _program_counter += 3; return("Error: el símbolo \"" + label + "\" ya está definido."); } _program_counter += 3; } else { if (addr_value > MAX_ADDR) { addr_value = 0x7FFF; _lines_opcode.Add(_line_count + 1, opcode + addr_value.ToString("X4")); return("Error, dirección fuera de rango, debe ser menor o igual a 0x7FFF"); } _lines_opcode.Add(_line_count + 1, opcode + addr_value.ToString("X4")); } return("PC= " + cp + " LABEL=" + label + " OPCODE=" + inst + " ID=" + id + " M:" + addr_mode); }
/// <summary> /// Visit a parse tree produced by the <c>InstruccionCompleta</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 VisitInstruccionCompleta([NotNull] SicAsmParser.InstruccionCompletaContext context) { return(VisitChildren(context)); }