diff --git a/utils/spdx/src/main/kotlin/SpdxExpression.kt b/utils/spdx/src/main/kotlin/SpdxExpression.kt index 8ce617adcb6a5..902ff0d72a95e 100644 --- a/utils/spdx/src/main/kotlin/SpdxExpression.kt +++ b/utils/spdx/src/main/kotlin/SpdxExpression.kt @@ -23,11 +23,9 @@ import com.fasterxml.jackson.annotation.JsonCreator import com.fasterxml.jackson.databind.annotation.JsonSerialize import com.fasterxml.jackson.databind.ser.std.ToStringSerializer -import org.antlr.v4.runtime.CharStreams -import org.antlr.v4.runtime.CommonTokenStream - import org.ossreviewtoolkit.utils.spdx.SpdxConstants.DOCUMENT_REF_PREFIX import org.ossreviewtoolkit.utils.spdx.SpdxConstants.LICENSE_REF_PREFIX +import org.ossreviewtoolkit.utils.spdx.parser.SpdxExpressionParser /** * An SPDX expression as defined by version 2.1 of the [SPDX specification, appendix IV][1]. @@ -86,21 +84,8 @@ sealed class SpdxExpression { * allowed ([ALLOW_DEPRECATED][Strictness.ALLOW_DEPRECATED]) or only current license identifiers are allowed * ([ALLOW_CURRENT][Strictness.ALLOW_CURRENT]). Throws an [SpdxException] if the string cannot be parsed. */ - fun parse(expression: String, strictness: Strictness): SpdxExpression { - val charStream = CharStreams.fromString(expression) - val lexer = SpdxExpressionLexer(charStream).apply { - removeErrorListeners() - addErrorListener(SpdxErrorListener()) - } - - val tokenStream = CommonTokenStream(lexer) - val parser = SpdxExpressionParser(tokenStream).apply { - removeErrorListeners() - addErrorListener(SpdxErrorListener()) - } - - return SpdxExpressionDefaultVisitor(strictness).visit(parser.licenseExpression()) - } + fun parse(expression: String, strictness: Strictness): SpdxExpression = + SpdxExpressionParser(expression, strictness).parse() } /** diff --git a/utils/spdx/src/test/kotlin/SpdxExpressionParserTest.kt b/utils/spdx/src/test/kotlin/SpdxExpressionParserTest.kt index 817efe398ba9b..94392344ac8b7 100644 --- a/utils/spdx/src/test/kotlin/SpdxExpressionParserTest.kt +++ b/utils/spdx/src/test/kotlin/SpdxExpressionParserTest.kt @@ -176,7 +176,7 @@ class SpdxExpressionParserTest : WordSpec({ SpdxExpression.parse("license WITH exception+") } - exception.message shouldBe "extraneous input '+' expecting " + exception.message shouldBe "Unexpected token 'PLUS(position=23)'." } "fail if a compound expression is used before WITH" { @@ -184,7 +184,7 @@ class SpdxExpressionParserTest : WordSpec({ SpdxExpression.parse("(license1 AND license2) WITH exception") } - exception.message shouldBe "mismatched input 'WITH' expecting {AND, OR, ')', '+'}" + exception.message shouldBe "Unexpected token 'WITH(position=25)'." } "fail on an invalid symbol" { @@ -192,7 +192,7 @@ class SpdxExpressionParserTest : WordSpec({ SpdxExpression.parse("/") } - exception.message shouldBe "token recognition error at: '/'" + exception.message shouldBe "Unexpected character '/' at position 1." } "fail on a syntax error" { @@ -200,8 +200,7 @@ class SpdxExpressionParserTest : WordSpec({ SpdxExpression.parse("((") } - exception.message shouldBe - "mismatched input '' expecting {'(', DOCUMENTREFERENCE, LICENSEREFERENCE, IDSTRING}" + exception.message shouldBe "Unexpected token 'null'." } } })