Added parameter to keep string literal delimiters

master
Marco Maccaferri 2019-04-28 17:57:08 +02:00
rodzic def67dfc39
commit 58ad0cf425
3 zmienionych plików z 24 dodań i 5 usunięć

Wyświetl plik

@ -99,6 +99,18 @@ public class SourceFormatterTest {
assertEquals("TEST ld hl, TEST\r\n", formatter.format());
}
@Test
public void testKeepStringLiteralDelimiters() throws Exception {
StringBuilder builder = new StringBuilder();
builder.append("test1 db 'string'").append("\n");
builder.append("test2 db \"string\"").append("\n");
SourceBuilder sourceBuilder = new SourceBuilder(new ArrayList<File>());
Source source = sourceBuilder.parse(new StringReader(builder.toString()), null);
SourceFormatter formatter = new SourceFormatter(source);
assertEquals("test1 db 'string'\r\ntest2 db \"string\"\r\n", formatter.format());
}
public String format(String... sourceLines) {
StringBuilder builder = new StringBuilder();
for (String lineText : sourceLines) {

Wyświetl plik

@ -288,7 +288,7 @@ public class Parser {
@Override
public State parse(char character) {
if (character == '"') {
expressionBuilder.addValueToken(new StringLiteral(accumulator.toString()));
expressionBuilder.addValueToken(new StringLiteral(character, accumulator.toString()));
accumulator.setLength(0);
return argumentOperatorState;
}
@ -367,7 +367,7 @@ public class Parser {
expressionBuilder.addValueToken(new CharacterLiteral(accumulator.charAt(0)));
}
else {
expressionBuilder.addValueToken(new StringLiteral(accumulator.toString()));
expressionBuilder.addValueToken(new StringLiteral(character, accumulator.toString()));
}
accumulator.setLength(0);
return argumentOperatorState;

Wyświetl plik

@ -4,9 +4,11 @@ import java.util.List;
public class StringLiteral extends Literal {
private final char delimiter;
private final String string;
public StringLiteral(String string) {
public StringLiteral(char delimiter, String string) {
this.delimiter = delimiter;
this.string = string;
}
@ -49,7 +51,12 @@ public class StringLiteral extends Literal {
public String toString() {
String escaped = string;
escaped = escaped.replace("\\", "\\\\");
escaped = escaped.replace("\"", "\\\"");
if (delimiter == '"') {
escaped = escaped.replace("\"", "\\\"");
}
else if (delimiter == '\'') {
escaped = escaped.replace("'", "\\'");
}
escaped = escaped.replace("\0", "\\0");
escaped = escaped.replace("\7", "\\a");
escaped = escaped.replace("\t", "\\t");
@ -57,7 +64,7 @@ public class StringLiteral extends Literal {
escaped = escaped.replace("\f", "\\f");
escaped = escaped.replace("\r", "\\r");
escaped = escaped.replace("\33", "\\e");
return "\"" + escaped + "\"";
return delimiter + escaped + delimiter;
}
@Override