Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Commit

Permalink
Exception when SNBT parsing fails
Browse files Browse the repository at this point in the history
  • Loading branch information
jglrxavpok committed Oct 16, 2020
1 parent 9bb8399 commit e8c76e8
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 24 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ java {
}

group 'org.jglrxavpok.nbt'
version '1.1.1'
version '1.1.3'

repositories {
mavenCentral()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.jglrxavpok.hephaistos.antlr

import org.antlr.v4.runtime.tree.ErrorNode
import org.jglrxavpok.hephaistos.nbt.*

object SNBTParsingVisitor: SNBTBaseVisitor<NBT>() {
Expand Down Expand Up @@ -92,5 +93,4 @@ object SNBTParsingVisitor: SNBTBaseVisitor<NBT>() {
override fun visitIdentifier(ctx: SNBTParser.IdentifierContext?): NBT? {
error("Should not access this rule directly")
}

}
24 changes: 21 additions & 3 deletions src/main/kotlin/org/jglrxavpok/hephaistos/nbt/SNBTParser.kt
Original file line number Diff line number Diff line change
@@ -1,23 +1,41 @@
package org.jglrxavpok.hephaistos.nbt

import org.antlr.v4.runtime.*
import org.jglrxavpok.hephaistos.antlr.SNBTLexer
import org.antlr.v4.runtime.CharStreams
import org.antlr.v4.runtime.CommonTokenStream
import org.jglrxavpok.hephaistos.antlr.SNBTParsingVisitor
import java.io.Reader
import kotlin.jvm.Throws
import org.jglrxavpok.hephaistos.antlr.SNBTParser as ANTLRParser

class SNBTParser(val reader: Reader): AutoCloseable, Cloneable {
class SNBTParser(val reader: Reader): BaseErrorListener(), AutoCloseable, Cloneable {

@Throws(NBTException::class)
fun parse(): NBT {
val stream = CharStreams.fromString(reader.readText())
val lexer = SNBTLexer(stream)
lexer.removeErrorListeners()
lexer.addErrorListener(this)

val tokens = CommonTokenStream(lexer)
val parser = ANTLRParser(tokens)
parser.removeErrorListeners()
parser.addErrorListener(this)

return parser.snbt().accept(SNBTParsingVisitor)
}

override fun close() {
reader.close()
}

override fun syntaxError(
recognizer: Recognizer<*, *>?,
offendingSymbol: Any?,
line: Int,
charPositionInLine: Int,
msg: String?,
e: RecognitionException?
) {
throw NBTException("Failed to parse SNBT: Line $line, column $charPositionInLine $msg", e)
}
}
12 changes: 11 additions & 1 deletion src/test/java/snbt/SNBTCoherencyTests.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package snbt;

import org.jglrxavpok.hephaistos.nbt.*;
import org.junit.Assert;
import org.junit.Test;

import java.io.StringReader;
Expand All @@ -10,7 +11,7 @@
public class SNBTCoherencyTests {

@Test
public void testCoherence() {
public void testCoherence() throws NBTException {
NBTCompound c = new NBTCompound();

NBTCompound inside = new NBTCompound();
Expand All @@ -37,4 +38,13 @@ public void testCoherence() {
assertEquals(c, parser.parse());
}
}

@Test(expected = NBTException.class)
public void syntaxError() throws NBTException {
String snbt = "{display:{Lore:[\"text here\"]}";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
parser.parse();
}
Assert.fail("Missing bracket, should not parse");
}
}
36 changes: 18 additions & 18 deletions src/test/java/snbt/SNBTParserTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
public class SNBTParserTests {

@Test
public void parseInt() {
public void parseInt() throws NBTException {
String snbt = "42";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -20,7 +20,7 @@ public void parseInt() {
}

@Test
public void parseNegativeInt() {
public void parseNegativeInt() throws NBTException {
String snbt = "-99";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -30,7 +30,7 @@ public void parseNegativeInt() {
}

@Test
public void parseByte() {
public void parseByte() throws NBTException {
String snbt = "42b";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -40,7 +40,7 @@ public void parseByte() {
}

@Test
public void parseNegativeByte() {
public void parseNegativeByte() throws NBTException {
String snbt = "-99B";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -50,7 +50,7 @@ public void parseNegativeByte() {
}

@Test
public void parseShort() {
public void parseShort() throws NBTException {
String snbt = "22000s";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -60,7 +60,7 @@ public void parseShort() {
}

@Test
public void parseNegativeShort() {
public void parseNegativeShort() throws NBTException {
String snbt = "-21999S";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -70,7 +70,7 @@ public void parseNegativeShort() {
}

@Test
public void parseLong() {
public void parseLong() throws NBTException {
String snbt = "1234567890000000l";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -80,7 +80,7 @@ public void parseLong() {
}

@Test
public void parseNegativeLong() {
public void parseNegativeLong() throws NBTException {
String snbt = "-9876543210000000L";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -90,7 +90,7 @@ public void parseNegativeLong() {
}

@Test
public void parseFloat() {
public void parseFloat() throws NBTException {
String snbt = "3.14f";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -100,7 +100,7 @@ public void parseFloat() {
}

@Test
public void parseNegativeFloat() {
public void parseNegativeFloat() throws NBTException {
String snbt = "-6.28F";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -110,7 +110,7 @@ public void parseNegativeFloat() {
}

@Test
public void parseDoubleWithTerminal() {
public void parseDoubleWithTerminal() throws NBTException {
String snbt = "2.14d";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -120,7 +120,7 @@ public void parseDoubleWithTerminal() {
}

@Test
public void parseNegativeDoubleWithTerminal() {
public void parseNegativeDoubleWithTerminal() throws NBTException {
String snbt = "-1.184d";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -130,7 +130,7 @@ public void parseNegativeDoubleWithTerminal() {
}

@Test
public void parseDoubleWithoutTerminal() {
public void parseDoubleWithoutTerminal() throws NBTException {
String snbt = "25.987";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -140,7 +140,7 @@ public void parseDoubleWithoutTerminal() {
}

@Test
public void parseNegativeDoubleWithoutTerminal() {
public void parseNegativeDoubleWithoutTerminal() throws NBTException {
String snbt = "-111.11";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -150,7 +150,7 @@ public void parseNegativeDoubleWithoutTerminal() {
}

@Test
public void parseIntegerArray() {
public void parseIntegerArray() throws NBTException {
String snbt = "[I;456,987,10]";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -160,7 +160,7 @@ public void parseIntegerArray() {
}

@Test
public void parseByteArray() {
public void parseByteArray() throws NBTException {
String snbt = "[B;10b,-11B,127b]";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -170,7 +170,7 @@ public void parseByteArray() {
}

@Test
public void parseLongArray() {
public void parseLongArray() throws NBTException {
String snbt = "[L;123456789l,-1563487L,16354658L]";
try(SNBTParser parser = new SNBTParser(new StringReader(snbt))) {
NBT element = parser.parse();
Expand All @@ -180,7 +180,7 @@ public void parseLongArray() {
}

@Test
public void parseBoolean() {
public void parseBoolean() throws NBTException {
try(SNBTParser parser = new SNBTParser(new StringReader("false"))) {
NBT element = parser.parse();
assertTrue(element instanceof NBTByte);
Expand Down

0 comments on commit e8c76e8

Please sign in to comment.