From e8c76e83884af8da564130e9eac8c87624dc28ba Mon Sep 17 00:00:00 2001 From: jglrxavpok Date: Fri, 16 Oct 2020 14:41:33 +0200 Subject: [PATCH] Exception when SNBT parsing fails --- build.gradle | 2 +- .../hephaistos/antlr/SNBTParsingVisitor.kt | 2 +- .../jglrxavpok/hephaistos/nbt/SNBTParser.kt | 24 +++++++++++-- src/test/java/snbt/SNBTCoherencyTests.java | 12 ++++++- src/test/java/snbt/SNBTParserTests.java | 36 +++++++++---------- 5 files changed, 52 insertions(+), 24 deletions(-) diff --git a/build.gradle b/build.gradle index 46bcf2f..eaa0c65 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ java { } group 'org.jglrxavpok.nbt' -version '1.1.1' +version '1.1.3' repositories { mavenCentral() diff --git a/src/main/kotlin/org/jglrxavpok/hephaistos/antlr/SNBTParsingVisitor.kt b/src/main/kotlin/org/jglrxavpok/hephaistos/antlr/SNBTParsingVisitor.kt index cc9f890..96b66cd 100644 --- a/src/main/kotlin/org/jglrxavpok/hephaistos/antlr/SNBTParsingVisitor.kt +++ b/src/main/kotlin/org/jglrxavpok/hephaistos/antlr/SNBTParsingVisitor.kt @@ -1,5 +1,6 @@ package org.jglrxavpok.hephaistos.antlr +import org.antlr.v4.runtime.tree.ErrorNode import org.jglrxavpok.hephaistos.nbt.* object SNBTParsingVisitor: SNBTBaseVisitor() { @@ -92,5 +93,4 @@ object SNBTParsingVisitor: SNBTBaseVisitor() { override fun visitIdentifier(ctx: SNBTParser.IdentifierContext?): NBT? { error("Should not access this rule directly") } - } \ No newline at end of file diff --git a/src/main/kotlin/org/jglrxavpok/hephaistos/nbt/SNBTParser.kt b/src/main/kotlin/org/jglrxavpok/hephaistos/nbt/SNBTParser.kt index d5e48b1..e77f594 100644 --- a/src/main/kotlin/org/jglrxavpok/hephaistos/nbt/SNBTParser.kt +++ b/src/main/kotlin/org/jglrxavpok/hephaistos/nbt/SNBTParser.kt @@ -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) + } } \ No newline at end of file diff --git a/src/test/java/snbt/SNBTCoherencyTests.java b/src/test/java/snbt/SNBTCoherencyTests.java index a5ef78a..e7dcffa 100644 --- a/src/test/java/snbt/SNBTCoherencyTests.java +++ b/src/test/java/snbt/SNBTCoherencyTests.java @@ -1,6 +1,7 @@ package snbt; import org.jglrxavpok.hephaistos.nbt.*; +import org.junit.Assert; import org.junit.Test; import java.io.StringReader; @@ -10,7 +11,7 @@ public class SNBTCoherencyTests { @Test - public void testCoherence() { + public void testCoherence() throws NBTException { NBTCompound c = new NBTCompound(); NBTCompound inside = new NBTCompound(); @@ -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"); + } } diff --git a/src/test/java/snbt/SNBTParserTests.java b/src/test/java/snbt/SNBTParserTests.java index f260024..0f6176e 100644 --- a/src/test/java/snbt/SNBTParserTests.java +++ b/src/test/java/snbt/SNBTParserTests.java @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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(); @@ -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);