mirror of
https://github.com/AppleCommander/bastools.git
synced 2026-04-20 23:16:53 +00:00
Adding special handling for DATA statement. #48.
This commit is contained in:
@@ -4,10 +4,7 @@ import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Queue;
|
||||
|
||||
import io.github.applecommander.bastools.api.model.Line;
|
||||
import io.github.applecommander.bastools.api.model.Program;
|
||||
import io.github.applecommander.bastools.api.model.Statement;
|
||||
import io.github.applecommander.bastools.api.model.Token;
|
||||
import io.github.applecommander.bastools.api.model.*;
|
||||
import io.github.applecommander.bastools.api.model.Token.Type;
|
||||
|
||||
/**
|
||||
@@ -50,10 +47,18 @@ public class Parser {
|
||||
|
||||
public Statement readStatement() {
|
||||
Statement statement = new Statement();
|
||||
Token firstToken = null;
|
||||
while (!tokens.isEmpty()) {
|
||||
if (tokens.peek().type == Type.EOL) break;
|
||||
Token t = tokens.remove();
|
||||
if (t.type == Type.SYNTAX && ":".equals(t.text)) break;
|
||||
if (firstToken == null) {
|
||||
firstToken = t;
|
||||
}
|
||||
else if (firstToken.keyword == ApplesoftKeyword.DATA && t.keyword != null) {
|
||||
// AppleSoft doesn't put actual keyword or tokens into data (beyond quotes or comma)
|
||||
t = Token.ident(t.line, t.keyword.text);
|
||||
}
|
||||
statement.tokens.add(t);
|
||||
}
|
||||
return statement;
|
||||
|
||||
@@ -2,6 +2,8 @@ package io.github.applecommander.bastools.api;
|
||||
|
||||
import java.util.Queue;
|
||||
|
||||
import io.github.applecommander.bastools.api.model.ApplesoftKeyword;
|
||||
import io.github.applecommander.bastools.api.model.Statement;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
@@ -9,6 +11,10 @@ import io.github.applecommander.bastools.api.model.Program;
|
||||
import io.github.applecommander.bastools.api.model.Token;
|
||||
import io.github.applecommander.bastools.api.utils.TokenBuilder;
|
||||
|
||||
import javax.xml.crypto.Data;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
public class ParserTest {
|
||||
@Test
|
||||
public void testBlankLines() {
|
||||
@@ -22,4 +28,42 @@ public class ParserTest {
|
||||
Program program = parser.parse();
|
||||
Assert.assertNotNull(program);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMinusInData() {
|
||||
Queue<Token> tokens = TokenBuilder.builder()
|
||||
// 10 DATA -5
|
||||
.number(10.0).keyword(ApplesoftKeyword.DATA).keyword(ApplesoftKeyword.sub).number(5.0).eol()
|
||||
.tokens();
|
||||
Parser parser = new Parser(tokens);
|
||||
Program program = parser.parse();
|
||||
assertEquals(1, program.lines.size());
|
||||
assertEquals(1, program.lines.get(0).statements.size());
|
||||
Statement statement = program.lines.get(0).statements.get(0);
|
||||
assertEquals(3, statement.tokens.size());
|
||||
assertEquals(ApplesoftKeyword.DATA, statement.tokens.get(0).keyword);
|
||||
// In this case, the "-" is treated as text
|
||||
assertEquals("-", statement.tokens.get(1).text);
|
||||
assertEquals(Double.valueOf(5.0), statement.tokens.get(2).number);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMinusInExpression() {
|
||||
Queue<Token> tokens = TokenBuilder.builder()
|
||||
// 10 A=-5
|
||||
.number(10.0).ident("A").keyword(ApplesoftKeyword.eq).keyword(ApplesoftKeyword.sub).number(5.0).eol()
|
||||
.tokens();
|
||||
|
||||
Parser parser = new Parser(tokens);
|
||||
Program program = parser.parse();
|
||||
assertEquals(1, program.lines.size());
|
||||
assertEquals(1, program.lines.get(0).statements.size());
|
||||
Statement statement = program.lines.get(0).statements.get(0);
|
||||
assertEquals(4, statement.tokens.size());
|
||||
assertEquals(Token.Type.IDENT, statement.tokens.get(0).type);
|
||||
assertEquals(ApplesoftKeyword.eq, statement.tokens.get(1).keyword);
|
||||
// In this case, the "-" is an actual keyword
|
||||
assertEquals(ApplesoftKeyword.sub, statement.tokens.get(2).keyword);
|
||||
assertEquals(Double.valueOf(5.0), statement.tokens.get(3).number);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user