Исправления и оптимизация

This commit is contained in:
Victor 2014-08-22 11:56:18 +03:00
parent 6ead777ba3
commit b1d8591410
30 changed files with 1194 additions and 1194 deletions

View File

@ -26,7 +26,7 @@ import javax.swing.text.Utilities;
* Îńíîâíŕ˙ ďŕíĺëü ďđčëîćĺíč˙. * Îńíîâíŕ˙ ďŕíĺëü ďđčëîćĺíč˙.
* @author aNNiMON * @author aNNiMON
*/ */
public class AnalyzerPanel extends JPanel { public final class AnalyzerPanel extends JPanel {
private JLabel lineNumberLabel; private JLabel lineNumberLabel;
private JTextPane textPane; private JTextPane textPane;

View File

@ -7,7 +7,7 @@ import java.util.ArrayList;
* Êîíâåðòåð äèðåêòèâ. * Êîíâåðòåð äèðåêòèâ.
* @author aNNiMON * @author aNNiMON
*/ */
public class DirectiveConverter { public final class DirectiveConverter {
private static final Directive[] DIRECTIVES = { private static final Directive[] DIRECTIVES = {
new Comma(), new Comma(),
@ -24,9 +24,9 @@ public class DirectiveConverter {
* @return èäåíòèôèêàòîð äèðåêòèâû. * @return èäåíòèôèêàòîð äèðåêòèâû.
*/ */
public static int convert(String text) { public static int convert(String text) {
for (int i = 0; i < DIRECTIVES.length; i++) { for (Directive dir : DIRECTIVES) {
if (DIRECTIVES[i].isDirective(text)) { if (dir.isDirective(text)) {
return DIRECTIVES[i].getId(); return dir.getId();
} }
} }

View File

@ -4,7 +4,7 @@ package com.annimon.asm;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class LexicLine { public final class LexicLine {
int lineNumber; int lineNumber;
int[] line; int[] line;

View File

@ -5,9 +5,9 @@ import java.util.ArrayList;
/** /**
* @author aNNiMON * @author aNNiMON
*/ */
public class LexicTable { public final class LexicTable {
private ArrayList<LexicLine> lexicLines; private final ArrayList<LexicLine> lexicLines;
public LexicTable() { public LexicTable() {
lexicLines = new ArrayList<>(); lexicLines = new ArrayList<>();
@ -31,7 +31,7 @@ public class LexicTable {
@Override @Override
public String toString() { public String toString() {
StringBuilder text = new StringBuilder(); final StringBuilder text = new StringBuilder();
for(LexicLine lexic : lexicLines) { for(LexicLine lexic : lexicLines) {
text.append(lexic.lineNumber).append(':'); text.append(lexic.lineNumber).append(':');
int[] array = lexic.line; int[] array = lexic.line;

View File

@ -6,11 +6,11 @@ import com.annimon.asm.directives.ID;
* Ëåêñè÷åñêèé àíàëèçàòîð. * Ëåêñè÷åñêèé àíàëèçàòîð.
* @author aNNiMON * @author aNNiMON
*/ */
public class LexicalAnalyzer { public final class LexicalAnalyzer {
private String[] lines; private final String[] lines;
private LexicTable lexicTable; private final LexicTable lexicTable;
private VarTable varTable; private final VarTable varTable;
public LexicalAnalyzer(String text) { public LexicalAnalyzer(String text) {
lines = text.split(System.lineSeparator()); lines = text.split(System.lineSeparator());
@ -40,14 +40,14 @@ public class LexicalAnalyzer {
} }
private void analyzeLine(int lineNumber) { private void analyzeLine(int lineNumber) {
String line = lines[lineNumber]; final String line = lines[lineNumber];
// Åñëè ñòðîêà íå ñîäåðæèò êîìàíä - ïðîïóñêàåì. // Åñëè ñòðîêà íå ñîäåðæèò êîìàíä - ïðîïóñêàåì.
if (line.isEmpty()) return; if (line.isEmpty()) return;
String[] parts = DirectiveConverter.split(line); String[] parts = DirectiveConverter.split(line);
// Êîíâåðòèðóåì äèðåêòèâû â ñîîòâåòñòâóþùèå èì èäåíòèôèêàòîðû. // Êîíâåðòèðóåì äèðåêòèâû â ñîîòâåòñòâóþùèå èì èäåíòèôèêàòîðû.
int length = parts.length; final int length = parts.length;
int[] lexicIds = new int[length]; final int[] lexicIds = new int[length];
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
lexicIds[i] = DirectiveConverter.convert(parts[i].trim()); lexicIds[i] = DirectiveConverter.convert(parts[i].trim());
} }

View File

@ -6,7 +6,7 @@ import com.annimon.asm.directives.ID;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class ListingGenerateHelper { public final class ListingGenerateHelper {
private static final String[] SEGMENT_REGISTERS = { private static final String[] SEGMENT_REGISTERS = {
"es", "cs", "ss", "ds" "es", "cs", "ss", "ds"
@ -40,10 +40,10 @@ public class ListingGenerateHelper {
* @return ñòðîêà "LL HH" ëèáî "XX" â çàâèñèìîñòè îò ðàçìåðà. * @return ñòðîêà "LL HH" ëèáî "XX" â çàâèñèìîñòè îò ðàçìåðà.
*/ */
public static String toLittleEndianString(String text) { public static String toLittleEndianString(String text) {
Integer value = DirectiveConverter.parseInteger(text); final Integer value = DirectiveConverter.parseInteger(text);
if (value == null) return ""; if (value == null) return "";
if ( (-128 <= value.intValue()) && (value.intValue() <= 255) ) { if ( (-128 <= value) && (value <= 255) ) {
return toHexString(value); return toHexString(value);
} }
@ -75,7 +75,7 @@ public class ListingGenerateHelper {
* @return êîä ðåãèñòðà (3 áèòà). * @return êîä ðåãèñòðà (3 áèòà).
*/ */
public static byte getRegisterCode(String register) { public static byte getRegisterCode(String register) {
String reg = register.toLowerCase(); final String reg = register.toLowerCase();
switch (reg) { switch (reg) {
case "ax": case "al": return 0b000; case "ax": case "al": return 0b000;
@ -97,7 +97,7 @@ public class ListingGenerateHelper {
* @return êîä ñåãìåíòíîãî ðåãèñòðà, ëèáî -1, åñëè ðåãèñòð íå ñåãìåíòíûé. * @return êîä ñåãìåíòíîãî ðåãèñòðà, ëèáî -1, åñëè ðåãèñòð íå ñåãìåíòíûé.
*/ */
public static byte getSegmentRegisterCode(String register) { public static byte getSegmentRegisterCode(String register) {
String reg = register.toLowerCase(); final String reg = register.toLowerCase();
for (byte i = 0; i < SEGMENT_REGISTERS.length; i++) { for (byte i = 0; i < SEGMENT_REGISTERS.length; i++) {
if (reg.equals(SEGMENT_REGISTERS[i])) return i; if (reg.equals(SEGMENT_REGISTERS[i])) return i;
} }

View File

@ -13,16 +13,16 @@ import com.annimon.asm.directives.Variable;
* Ãåíåðèðîâàíèå ëèñòèíãà. * Ãåíåðèðîâàíèå ëèñòèíãà.
* @author aNNiMON * @author aNNiMON
*/ */
public class ListingGenerator { public final class ListingGenerator {
private static final IListingGenerator[] DIRECTIVES = { private static final IListingGenerator[] DIRECTIVES = {
new Variable(), new Variable(),
new Add(), new Mul(), new Pop(), new Push(), new Idiv() new Add(), new Mul(), new Pop(), new Push(), new Idiv()
}; };
private LexicTable lexicTable; private final LexicTable lexicTable;
private VarTable varTable; private final VarTable varTable;
private String[] lines; private final String[] lines;
public ListingGenerator(LexicTable lexicTable, VarTable varTable, String[] lines) { public ListingGenerator(LexicTable lexicTable, VarTable varTable, String[] lines) {
this.lexicTable = lexicTable; this.lexicTable = lexicTable;
@ -31,7 +31,7 @@ public class ListingGenerator {
} }
public String generate() { public String generate() {
StringBuilder text = new StringBuilder(); final StringBuilder text = new StringBuilder();
short offset = VarTable.getOffset(); short offset = VarTable.getOffset();
for (int i = 0; i < lexicTable.getSize(); i++) { for (int i = 0; i < lexicTable.getSize(); i++) {
@ -53,8 +53,8 @@ public class ListingGenerator {
} }
private String generateLine(int lineNumber, int[] lexic, String[] parts) { private String generateLine(int lineNumber, int[] lexic, String[] parts) {
for (int i = 0; i < DIRECTIVES.length; i++) { for (IListingGenerator dir : DIRECTIVES) {
String text = DIRECTIVES[i].generate(lineNumber, lexic, parts, varTable); String text = dir.generate(lineNumber, lexic, parts, varTable);
if (!text.isEmpty()) return text; if (!text.isEmpty()) return text;
} }
return ""; return "";

View File

@ -5,7 +5,7 @@ import javax.swing.JFrame;
/** /**
* @author aNNiMON * @author aNNiMON
*/ */
public class Main extends JFrame { public final class Main extends JFrame {
public static void main(String[] args) { public static void main(String[] args) {
new Main().setVisible(true); new Main().setVisible(true);

View File

@ -13,14 +13,14 @@ import com.annimon.asm.exceptions.ExceptionWithLineNumber;
* Ñèíòàêñè÷åñêèé àíàëèçàòîð. * Ñèíòàêñè÷åñêèé àíàëèçàòîð.
* @author aNNiMON * @author aNNiMON
*/ */
public class SyntaxAnalyzer { public final class SyntaxAnalyzer {
private static final ISyntaxChecker[] DIRECTIVES = { private static final ISyntaxChecker[] DIRECTIVES = {
new Add(), new Mul(), new Push(), new Pop(), new Idiv(), new Add(), new Mul(), new Push(), new Pop(), new Idiv(),
new Variable() new Variable()
}; };
private LexicTable lexicTable; private final LexicTable lexicTable;
public SyntaxAnalyzer(LexicTable lexicTable) { public SyntaxAnalyzer(LexicTable lexicTable) {
this.lexicTable = lexicTable; this.lexicTable = lexicTable;
@ -34,8 +34,8 @@ public class SyntaxAnalyzer {
} }
private void analyzeLine(int lineNumber, int[] lexic) throws ExceptionWithLineNumber { private void analyzeLine(int lineNumber, int[] lexic) throws ExceptionWithLineNumber {
for (int i = 0; i < DIRECTIVES.length; i++) { for (ISyntaxChecker dir : DIRECTIVES) {
if (DIRECTIVES[i].check(lineNumber, lexic)) { if (dir.check(lineNumber, lexic)) {
return; return;
} }
} }

View File

@ -4,7 +4,7 @@ package com.annimon.asm;
* Êëàññ ïåðåìåííîé. * Êëàññ ïåðåìåííîé.
* @author aNNiMON * @author aNNiMON
*/ */
public class Var { public final class Var {
String name; String name;
int type; int type;

View File

@ -7,10 +7,10 @@ import java.util.ArrayList;
* Òàáëèöà ïåðåìåííûõ. * Òàáëèöà ïåðåìåííûõ.
* @author aNNiMON * @author aNNiMON
*/ */
public class VarTable { public final class VarTable {
private ArrayList<Var> variables;
private static short offset; private static short offset;
private final ArrayList<Var> variables;
public VarTable() { public VarTable() {
variables = new ArrayList<>(); variables = new ArrayList<>();

View File

@ -12,7 +12,7 @@ import com.annimon.asm.exceptions.WrongArgumentException;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class Add extends Directive implements ISyntaxChecker, IListingGenerator { public final class Add extends Directive implements ISyntaxChecker, IListingGenerator {
public Add() { public Add() {
super("add", ID.ADD); super("add", ID.ADD);

View File

@ -4,7 +4,7 @@ package com.annimon.asm.directives;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class ByteRegister extends Register { public final class ByteRegister extends Register {
@Override @Override
public int getId() { public int getId() {

View File

@ -4,7 +4,7 @@ package com.annimon.asm.directives;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class ByteValue extends NumericValue { public final class ByteValue extends NumericValue {
@Override @Override
public int getId() { public int getId() {

View File

@ -4,7 +4,7 @@ package com.annimon.asm.directives;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class Comma extends Directive { public final class Comma extends Directive {
public Comma() { public Comma() {
super(",", ID.COMMA); super(",", ID.COMMA);

View File

@ -4,7 +4,7 @@ package com.annimon.asm.directives;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class DB extends Directive { public final class DB extends Directive {
public DB() { public DB() {
super("db", ID.DB); super("db", ID.DB);

View File

@ -4,7 +4,7 @@ package com.annimon.asm.directives;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class DW extends Directive { public final class DW extends Directive {
public DW() { public DW() {
super("dw", ID.DW); super("dw", ID.DW);

View File

@ -11,7 +11,7 @@ import com.annimon.asm.exceptions.WrongArgumentException;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class Idiv extends Directive implements ISyntaxChecker, IListingGenerator { public final class Idiv extends Directive implements ISyntaxChecker, IListingGenerator {
public Idiv() { public Idiv() {
super("idiv", ID.IDIV); super("idiv", ID.IDIV);
@ -36,7 +36,6 @@ public class Idiv extends Directive implements ISyntaxChecker, IListingGenerator
if (ids[0] != getId()) return ""; if (ids[0] != getId()) return "";
// MUL r/m 1111011w | mod111r/m // MUL r/m 1111011w | mod111r/m
StringBuilder sb = new StringBuilder();
int val = 0b1111011_0; int val = 0b1111011_0;
if ( (ids[1] == ID.REGISTER_WORD) || (ids[1] == ID.VAR_WORD) ) { if ( (ids[1] == ID.REGISTER_WORD) || (ids[1] == ID.VAR_WORD) ) {
val |= 1; val |= 1;
@ -68,6 +67,7 @@ public class Idiv extends Directive implements ISyntaxChecker, IListingGenerator
regID <<= 3; regID <<= 3;
modrm |= regID; modrm |= regID;
final StringBuilder sb = new StringBuilder();
sb.append(ListingGenerateHelper.toHexString(val)) sb.append(ListingGenerateHelper.toHexString(val))
.append(' ') .append(' ')
.append(ListingGenerateHelper.toHexString(modrm)) .append(ListingGenerateHelper.toHexString(modrm))

View File

@ -4,7 +4,7 @@ package com.annimon.asm.directives;
* Íåîïðåäåë¸ííîå çíà÷åíèå (?) * Íåîïðåäåë¸ííîå çíà÷åíèå (?)
* @author aNNiMON * @author aNNiMON
*/ */
public class InfinityValue extends NumericValue { public final class InfinityValue extends NumericValue {
@Override @Override
public int getId() { public int getId() {

View File

@ -11,7 +11,7 @@ import com.annimon.asm.exceptions.WrongArgumentException;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class Mul extends Directive implements ISyntaxChecker, IListingGenerator { public final class Mul extends Directive implements ISyntaxChecker, IListingGenerator {
public Mul() { public Mul() {
super("mul", ID.MUL); super("mul", ID.MUL);
@ -36,7 +36,6 @@ public class Mul extends Directive implements ISyntaxChecker, IListingGenerator
if (ids[0] != getId()) return ""; if (ids[0] != getId()) return "";
// MUL r/m 1111011w | mod100r/m // MUL r/m 1111011w | mod100r/m
StringBuilder sb = new StringBuilder();
int val = 0b1111011_0; int val = 0b1111011_0;
if ( (ids[1] == ID.REGISTER_WORD) || (ids[1] == ID.VAR_WORD) ) { if ( (ids[1] == ID.REGISTER_WORD) || (ids[1] == ID.VAR_WORD) ) {
val |= 1; val |= 1;
@ -68,6 +67,7 @@ public class Mul extends Directive implements ISyntaxChecker, IListingGenerator
regID <<= 3; regID <<= 3;
modrm |= regID; modrm |= regID;
final StringBuilder sb = new StringBuilder();
sb.append(ListingGenerateHelper.toHexString(val)) sb.append(ListingGenerateHelper.toHexString(val))
.append(' ') .append(' ')
.append(ListingGenerateHelper.toHexString(modrm)) .append(ListingGenerateHelper.toHexString(modrm))

View File

@ -10,7 +10,7 @@ import com.annimon.asm.exceptions.WrongArgumentException;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class Pop extends Directive implements ISyntaxChecker, IListingGenerator { public final class Pop extends Directive implements ISyntaxChecker, IListingGenerator {
public Pop() { public Pop() {
super("pop", ID.POP); super("pop", ID.POP);

View File

@ -10,7 +10,7 @@ import com.annimon.asm.exceptions.WrongArgumentException;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class Push extends Directive implements ISyntaxChecker, IListingGenerator { public final class Push extends Directive implements ISyntaxChecker, IListingGenerator {
public Push() { public Push() {
super("push", ID.PUSH); super("push", ID.PUSH);

View File

@ -12,7 +12,7 @@ import java.util.regex.Pattern;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class Variable extends Directive implements ISyntaxChecker, IListingGenerator { public final class Variable extends Directive implements ISyntaxChecker, IListingGenerator {
public Variable() { public Variable() {
super("", ID.VAR); super("", ID.VAR);

View File

@ -4,7 +4,7 @@ package com.annimon.asm.directives;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class WordRegister extends Register { public final class WordRegister extends Register {
@Override @Override
public int getId() { public int getId() {

View File

@ -4,7 +4,7 @@ package com.annimon.asm.directives;
* *
* @author aNNiMON * @author aNNiMON
*/ */
public class WordValue extends NumericValue { public final class WordValue extends NumericValue {
@Override @Override
public int getId() { public int getId() {

View File

@ -4,7 +4,7 @@ package com.annimon.asm.exceptions;
* Êëàññ îøèáêè ïðîïóùåííîé çàïÿòîé. * Êëàññ îøèáêè ïðîïóùåííîé çàïÿòîé.
* @author aNNiMON * @author aNNiMON
*/ */
public class CommaExpectedException extends ExceptionWithLineNumber { public final class CommaExpectedException extends ExceptionWithLineNumber {
public CommaExpectedException(int lineNumber) { public CommaExpectedException(int lineNumber) {
super("Comma expected", lineNumber); super("Comma expected", lineNumber);

View File

@ -6,7 +6,7 @@ package com.annimon.asm.exceptions;
*/ */
public abstract class ExceptionWithLineNumber extends Exception { public abstract class ExceptionWithLineNumber extends Exception {
private int lineNumber; private final int lineNumber;
public ExceptionWithLineNumber(String message, int lineNumber) { public ExceptionWithLineNumber(String message, int lineNumber) {
super(message); super(message);

View File

@ -4,7 +4,7 @@ package com.annimon.asm.exceptions;
* Êëàññ îøèáêè, êîãäà óêàçàíî ñëèøêîì ìàëî àðãóìåíòîâ êîìàíäû, íåæåëè îæèäàëîñü. * Êëàññ îøèáêè, êîãäà óêàçàíî ñëèøêîì ìàëî àðãóìåíòîâ êîìàíäû, íåæåëè îæèäàëîñü.
* @author aNNiMON * @author aNNiMON
*/ */
public class FewArgumentsException extends ExceptionWithLineNumber { public final class FewArgumentsException extends ExceptionWithLineNumber {
public FewArgumentsException(int lineNumber) { public FewArgumentsException(int lineNumber) {
super("Few arguments", lineNumber); super("Few arguments", lineNumber);

View File

@ -4,7 +4,7 @@ package com.annimon.asm.exceptions;
* Êëàññ îøèáêè äëÿ ïðåâûøåííîãî êîëè÷åñòâà àðãóìåíòîâ êîìàíäû. * Êëàññ îøèáêè äëÿ ïðåâûøåííîãî êîëè÷åñòâà àðãóìåíòîâ êîìàíäû.
* @author aNNiMON * @author aNNiMON
*/ */
public class TooManyArgumentsException extends ExceptionWithLineNumber { public final class TooManyArgumentsException extends ExceptionWithLineNumber {
public TooManyArgumentsException(int lineNumber) { public TooManyArgumentsException(int lineNumber) {
super("Too many arguments", lineNumber); super("Too many arguments", lineNumber);

View File

@ -4,7 +4,7 @@ package com.annimon.asm.exceptions;
* Êëàññ îøèáêè íåâåðíîãî àðãóìåíòà, êîãäà íå ñîâïàäàåò îæèäàåìûé òèï. * Êëàññ îøèáêè íåâåðíîãî àðãóìåíòà, êîãäà íå ñîâïàäàåò îæèäàåìûé òèï.
* @author aNNiMON * @author aNNiMON
*/ */
public class WrongArgumentException extends ExceptionWithLineNumber { public final class WrongArgumentException extends ExceptionWithLineNumber {
public WrongArgumentException(int lineNumber) { public WrongArgumentException(int lineNumber) {
super("Wrong argument", lineNumber); super("Wrong argument", lineNumber);