Исправления и оптимизация
This commit is contained in:
parent
6ead777ba3
commit
b1d8591410
@ -26,7 +26,7 @@ import javax.swing.text.Utilities;
|
||||
* Îńíîâíŕ˙ ďŕíĺëü ďđčëîćĺíč˙.
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class AnalyzerPanel extends JPanel {
|
||||
public final class AnalyzerPanel extends JPanel {
|
||||
|
||||
private JLabel lineNumberLabel;
|
||||
private JTextPane textPane;
|
||||
|
@ -7,7 +7,7 @@ import java.util.ArrayList;
|
||||
* Êîíâåðòåð äèðåêòèâ.
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class DirectiveConverter {
|
||||
public final class DirectiveConverter {
|
||||
|
||||
private static final Directive[] DIRECTIVES = {
|
||||
new Comma(),
|
||||
@ -24,9 +24,9 @@ public class DirectiveConverter {
|
||||
* @return èäåíòèôèêàòîð äèðåêòèâû.
|
||||
*/
|
||||
public static int convert(String text) {
|
||||
for (int i = 0; i < DIRECTIVES.length; i++) {
|
||||
if (DIRECTIVES[i].isDirective(text)) {
|
||||
return DIRECTIVES[i].getId();
|
||||
for (Directive dir : DIRECTIVES) {
|
||||
if (dir.isDirective(text)) {
|
||||
return dir.getId();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class LexicLine {
|
||||
public final class LexicLine {
|
||||
|
||||
int lineNumber;
|
||||
int[] line;
|
||||
|
@ -5,9 +5,9 @@ import java.util.ArrayList;
|
||||
/**
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class LexicTable {
|
||||
public final class LexicTable {
|
||||
|
||||
private ArrayList<LexicLine> lexicLines;
|
||||
private final ArrayList<LexicLine> lexicLines;
|
||||
|
||||
public LexicTable() {
|
||||
lexicLines = new ArrayList<>();
|
||||
@ -31,7 +31,7 @@ public class LexicTable {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder text = new StringBuilder();
|
||||
final StringBuilder text = new StringBuilder();
|
||||
for(LexicLine lexic : lexicLines) {
|
||||
text.append(lexic.lineNumber).append(':');
|
||||
int[] array = lexic.line;
|
||||
|
@ -6,11 +6,11 @@ import com.annimon.asm.directives.ID;
|
||||
* Ëåêñè÷åñêèé àíàëèçàòîð.
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class LexicalAnalyzer {
|
||||
public final class LexicalAnalyzer {
|
||||
|
||||
private String[] lines;
|
||||
private LexicTable lexicTable;
|
||||
private VarTable varTable;
|
||||
private final String[] lines;
|
||||
private final LexicTable lexicTable;
|
||||
private final VarTable varTable;
|
||||
|
||||
public LexicalAnalyzer(String text) {
|
||||
lines = text.split(System.lineSeparator());
|
||||
@ -40,14 +40,14 @@ public class LexicalAnalyzer {
|
||||
}
|
||||
|
||||
private void analyzeLine(int lineNumber) {
|
||||
String line = lines[lineNumber];
|
||||
final String line = lines[lineNumber];
|
||||
// Åñëè ñòðîêà íå ñîäåðæèò êîìàíä - ïðîïóñêàåì.
|
||||
if (line.isEmpty()) return;
|
||||
String[] parts = DirectiveConverter.split(line);
|
||||
|
||||
// Êîíâåðòèðóåì äèðåêòèâû â ñîîòâåòñòâóþùèå èì èäåíòèôèêàòîðû.
|
||||
int length = parts.length;
|
||||
int[] lexicIds = new int[length];
|
||||
final int length = parts.length;
|
||||
final int[] lexicIds = new int[length];
|
||||
for (int i = 0; i < length; i++) {
|
||||
lexicIds[i] = DirectiveConverter.convert(parts[i].trim());
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ import com.annimon.asm.directives.ID;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class ListingGenerateHelper {
|
||||
public final class ListingGenerateHelper {
|
||||
|
||||
private static final String[] SEGMENT_REGISTERS = {
|
||||
"es", "cs", "ss", "ds"
|
||||
@ -40,10 +40,10 @@ public class ListingGenerateHelper {
|
||||
* @return ñòðîêà "LL HH" ëèáî "XX" â çàâèñèìîñòè îò ðàçìåðà.
|
||||
*/
|
||||
public static String toLittleEndianString(String text) {
|
||||
Integer value = DirectiveConverter.parseInteger(text);
|
||||
final Integer value = DirectiveConverter.parseInteger(text);
|
||||
if (value == null) return "";
|
||||
|
||||
if ( (-128 <= value.intValue()) && (value.intValue() <= 255) ) {
|
||||
if ( (-128 <= value) && (value <= 255) ) {
|
||||
return toHexString(value);
|
||||
}
|
||||
|
||||
@ -75,7 +75,7 @@ public class ListingGenerateHelper {
|
||||
* @return êîä ðåãèñòðà (3 áèòà).
|
||||
*/
|
||||
public static byte getRegisterCode(String register) {
|
||||
String reg = register.toLowerCase();
|
||||
final String reg = register.toLowerCase();
|
||||
|
||||
switch (reg) {
|
||||
case "ax": case "al": return 0b000;
|
||||
@ -97,7 +97,7 @@ public class ListingGenerateHelper {
|
||||
* @return êîä ñåãìåíòíîãî ðåãèñòðà, ëèáî -1, åñëè ðåãèñòð íå ñåãìåíòíûé.
|
||||
*/
|
||||
public static byte getSegmentRegisterCode(String register) {
|
||||
String reg = register.toLowerCase();
|
||||
final String reg = register.toLowerCase();
|
||||
for (byte i = 0; i < SEGMENT_REGISTERS.length; i++) {
|
||||
if (reg.equals(SEGMENT_REGISTERS[i])) return i;
|
||||
}
|
||||
|
@ -13,16 +13,16 @@ import com.annimon.asm.directives.Variable;
|
||||
* Ãåíåðèðîâàíèå ëèñòèíãà.
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class ListingGenerator {
|
||||
public final class ListingGenerator {
|
||||
|
||||
private static final IListingGenerator[] DIRECTIVES = {
|
||||
new Variable(),
|
||||
new Add(), new Mul(), new Pop(), new Push(), new Idiv()
|
||||
};
|
||||
|
||||
private LexicTable lexicTable;
|
||||
private VarTable varTable;
|
||||
private String[] lines;
|
||||
private final LexicTable lexicTable;
|
||||
private final VarTable varTable;
|
||||
private final String[] lines;
|
||||
|
||||
public ListingGenerator(LexicTable lexicTable, VarTable varTable, String[] lines) {
|
||||
this.lexicTable = lexicTable;
|
||||
@ -31,7 +31,7 @@ public class ListingGenerator {
|
||||
}
|
||||
|
||||
public String generate() {
|
||||
StringBuilder text = new StringBuilder();
|
||||
final StringBuilder text = new StringBuilder();
|
||||
short offset = VarTable.getOffset();
|
||||
|
||||
for (int i = 0; i < lexicTable.getSize(); i++) {
|
||||
@ -53,8 +53,8 @@ public class ListingGenerator {
|
||||
}
|
||||
|
||||
private String generateLine(int lineNumber, int[] lexic, String[] parts) {
|
||||
for (int i = 0; i < DIRECTIVES.length; i++) {
|
||||
String text = DIRECTIVES[i].generate(lineNumber, lexic, parts, varTable);
|
||||
for (IListingGenerator dir : DIRECTIVES) {
|
||||
String text = dir.generate(lineNumber, lexic, parts, varTable);
|
||||
if (!text.isEmpty()) return text;
|
||||
}
|
||||
return "";
|
||||
|
@ -5,7 +5,7 @@ import javax.swing.JFrame;
|
||||
/**
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class Main extends JFrame {
|
||||
public final class Main extends JFrame {
|
||||
|
||||
public static void main(String[] args) {
|
||||
new Main().setVisible(true);
|
||||
|
@ -13,14 +13,14 @@ import com.annimon.asm.exceptions.ExceptionWithLineNumber;
|
||||
* Ñèíòàêñè÷åñêèé àíàëèçàòîð.
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class SyntaxAnalyzer {
|
||||
public final class SyntaxAnalyzer {
|
||||
|
||||
private static final ISyntaxChecker[] DIRECTIVES = {
|
||||
new Add(), new Mul(), new Push(), new Pop(), new Idiv(),
|
||||
new Variable()
|
||||
};
|
||||
|
||||
private LexicTable lexicTable;
|
||||
private final LexicTable lexicTable;
|
||||
|
||||
public SyntaxAnalyzer(LexicTable lexicTable) {
|
||||
this.lexicTable = lexicTable;
|
||||
@ -34,8 +34,8 @@ public class SyntaxAnalyzer {
|
||||
}
|
||||
|
||||
private void analyzeLine(int lineNumber, int[] lexic) throws ExceptionWithLineNumber {
|
||||
for (int i = 0; i < DIRECTIVES.length; i++) {
|
||||
if (DIRECTIVES[i].check(lineNumber, lexic)) {
|
||||
for (ISyntaxChecker dir : DIRECTIVES) {
|
||||
if (dir.check(lineNumber, lexic)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm;
|
||||
* Êëàññ ïåðåìåííîé.
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class Var {
|
||||
public final class Var {
|
||||
|
||||
String name;
|
||||
int type;
|
||||
|
@ -7,10 +7,10 @@ import java.util.ArrayList;
|
||||
* Òàáëèöà ïåðåìåííûõ.
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class VarTable {
|
||||
public final class VarTable {
|
||||
|
||||
private ArrayList<Var> variables;
|
||||
private static short offset;
|
||||
private final ArrayList<Var> variables;
|
||||
|
||||
public VarTable() {
|
||||
variables = new ArrayList<>();
|
||||
|
@ -12,7 +12,7 @@ import com.annimon.asm.exceptions.WrongArgumentException;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class Add extends Directive implements ISyntaxChecker, IListingGenerator {
|
||||
public final class Add extends Directive implements ISyntaxChecker, IListingGenerator {
|
||||
|
||||
public Add() {
|
||||
super("add", ID.ADD);
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm.directives;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class ByteRegister extends Register {
|
||||
public final class ByteRegister extends Register {
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm.directives;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class ByteValue extends NumericValue {
|
||||
public final class ByteValue extends NumericValue {
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm.directives;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class Comma extends Directive {
|
||||
public final class Comma extends Directive {
|
||||
|
||||
public Comma() {
|
||||
super(",", ID.COMMA);
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm.directives;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class DB extends Directive {
|
||||
public final class DB extends Directive {
|
||||
|
||||
public DB() {
|
||||
super("db", ID.DB);
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm.directives;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class DW extends Directive {
|
||||
public final class DW extends Directive {
|
||||
|
||||
public DW() {
|
||||
super("dw", ID.DW);
|
||||
|
@ -11,7 +11,7 @@ import com.annimon.asm.exceptions.WrongArgumentException;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class Idiv extends Directive implements ISyntaxChecker, IListingGenerator {
|
||||
public final class Idiv extends Directive implements ISyntaxChecker, IListingGenerator {
|
||||
|
||||
public Idiv() {
|
||||
super("idiv", ID.IDIV);
|
||||
@ -36,7 +36,6 @@ public class Idiv extends Directive implements ISyntaxChecker, IListingGenerator
|
||||
if (ids[0] != getId()) return "";
|
||||
|
||||
// MUL r/m 1111011w | mod111r/m
|
||||
StringBuilder sb = new StringBuilder();
|
||||
int val = 0b1111011_0;
|
||||
if ( (ids[1] == ID.REGISTER_WORD) || (ids[1] == ID.VAR_WORD) ) {
|
||||
val |= 1;
|
||||
@ -68,6 +67,7 @@ public class Idiv extends Directive implements ISyntaxChecker, IListingGenerator
|
||||
regID <<= 3;
|
||||
modrm |= regID;
|
||||
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append(ListingGenerateHelper.toHexString(val))
|
||||
.append(' ')
|
||||
.append(ListingGenerateHelper.toHexString(modrm))
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm.directives;
|
||||
* Íåîïðåäåë¸ííîå çíà÷åíèå (?)
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class InfinityValue extends NumericValue {
|
||||
public final class InfinityValue extends NumericValue {
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
|
@ -11,7 +11,7 @@ import com.annimon.asm.exceptions.WrongArgumentException;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class Mul extends Directive implements ISyntaxChecker, IListingGenerator {
|
||||
public final class Mul extends Directive implements ISyntaxChecker, IListingGenerator {
|
||||
|
||||
public Mul() {
|
||||
super("mul", ID.MUL);
|
||||
@ -36,7 +36,6 @@ public class Mul extends Directive implements ISyntaxChecker, IListingGenerator
|
||||
if (ids[0] != getId()) return "";
|
||||
|
||||
// MUL r/m 1111011w | mod100r/m
|
||||
StringBuilder sb = new StringBuilder();
|
||||
int val = 0b1111011_0;
|
||||
if ( (ids[1] == ID.REGISTER_WORD) || (ids[1] == ID.VAR_WORD) ) {
|
||||
val |= 1;
|
||||
@ -68,6 +67,7 @@ public class Mul extends Directive implements ISyntaxChecker, IListingGenerator
|
||||
regID <<= 3;
|
||||
modrm |= regID;
|
||||
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append(ListingGenerateHelper.toHexString(val))
|
||||
.append(' ')
|
||||
.append(ListingGenerateHelper.toHexString(modrm))
|
||||
|
@ -10,7 +10,7 @@ import com.annimon.asm.exceptions.WrongArgumentException;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class Pop extends Directive implements ISyntaxChecker, IListingGenerator {
|
||||
public final class Pop extends Directive implements ISyntaxChecker, IListingGenerator {
|
||||
|
||||
public Pop() {
|
||||
super("pop", ID.POP);
|
||||
|
@ -10,7 +10,7 @@ import com.annimon.asm.exceptions.WrongArgumentException;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class Push extends Directive implements ISyntaxChecker, IListingGenerator {
|
||||
public final class Push extends Directive implements ISyntaxChecker, IListingGenerator {
|
||||
|
||||
public Push() {
|
||||
super("push", ID.PUSH);
|
||||
|
@ -12,7 +12,7 @@ import java.util.regex.Pattern;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class Variable extends Directive implements ISyntaxChecker, IListingGenerator {
|
||||
public final class Variable extends Directive implements ISyntaxChecker, IListingGenerator {
|
||||
|
||||
public Variable() {
|
||||
super("", ID.VAR);
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm.directives;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class WordRegister extends Register {
|
||||
public final class WordRegister extends Register {
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm.directives;
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class WordValue extends NumericValue {
|
||||
public final class WordValue extends NumericValue {
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm.exceptions;
|
||||
* Êëàññ îøèáêè ïðîïóùåííîé çàïÿòîé.
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class CommaExpectedException extends ExceptionWithLineNumber {
|
||||
public final class CommaExpectedException extends ExceptionWithLineNumber {
|
||||
|
||||
public CommaExpectedException(int lineNumber) {
|
||||
super("Comma expected", lineNumber);
|
||||
|
@ -6,7 +6,7 @@ package com.annimon.asm.exceptions;
|
||||
*/
|
||||
public abstract class ExceptionWithLineNumber extends Exception {
|
||||
|
||||
private int lineNumber;
|
||||
private final int lineNumber;
|
||||
|
||||
public ExceptionWithLineNumber(String message, int lineNumber) {
|
||||
super(message);
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm.exceptions;
|
||||
* Êëàññ îøèáêè, êîãäà óêàçàíî ñëèøêîì ìàëî àðãóìåíòîâ êîìàíäû, íåæåëè îæèäàëîñü.
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class FewArgumentsException extends ExceptionWithLineNumber {
|
||||
public final class FewArgumentsException extends ExceptionWithLineNumber {
|
||||
|
||||
public FewArgumentsException(int lineNumber) {
|
||||
super("Few arguments", lineNumber);
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm.exceptions;
|
||||
* Êëàññ îøèáêè äëÿ ïðåâûøåííîãî êîëè÷åñòâà àðãóìåíòîâ êîìàíäû.
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class TooManyArgumentsException extends ExceptionWithLineNumber {
|
||||
public final class TooManyArgumentsException extends ExceptionWithLineNumber {
|
||||
|
||||
public TooManyArgumentsException(int lineNumber) {
|
||||
super("Too many arguments", lineNumber);
|
||||
|
@ -4,7 +4,7 @@ package com.annimon.asm.exceptions;
|
||||
* Êëàññ îøèáêè íåâåðíîãî àðãóìåíòà, êîãäà íå ñîâïàäàåò îæèäàåìûé òèï.
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class WrongArgumentException extends ExceptionWithLineNumber {
|
||||
public final class WrongArgumentException extends ExceptionWithLineNumber {
|
||||
|
||||
public WrongArgumentException(int lineNumber) {
|
||||
super("Wrong argument", lineNumber);
|
||||
|
Loading…
Reference in New Issue
Block a user