Adding special handling for DATA statement. #48.

This commit is contained in:
Rob Greene
2025-10-13 13:05:04 -05:00
parent 37f0a7c46d
commit aed6dd11c3
2 changed files with 53 additions and 4 deletions
@@ -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);
}
}