parser: fix integer literals

This commit is contained in:
alex committed 2023-09-12 00:46:09 -04:00
1 parent 1b363dcf56
commit f64a54fa06
4 files changed
+15 -7

No files matched your search

@@ -13,11 +13,11 @@ class Parser(source: PeekableSource<Token>, val attribution: NodeAttribution) {
} else {
val integer = it.text.toIntOrNull()
if (integer != null) {
IntegerLiteral(integer)
return@expect IntegerLiteral(integer)
}
val long = it.text.toLongOrNull()
if (long != null) {
LongLiteral(long)
return@expect LongLiteral(long)
}
throw ParseError("Illegal integer value")
}
@@ -46,4 +46,6 @@ object PorkElementTypes {
fun elementTypeFor(nodeType: NodeType): IElementType =
nodeTypeToElementType[nodeType]!!
val FailedToParse: IElementType = IElementType("FailedToParse", PorkLanguage)
}
@@ -17,5 +17,7 @@ class PorkParser : PsiParser {
return builder.treeBuilt
}
class ExitParser(val error: String) : RuntimeException("Exit Parser: $error")
class ExitParser(val error: String? = null) : RuntimeException(
if (error == null) "Fast Exit" else "Exit Parser: $error"
)
}
@@ -17,16 +17,20 @@ class PsiBuilderMarkAttribution(val builder: PsiBuilder) : ParserNodeAttribution
while (!builder.eof()) {
builder.advanceLexer()
}
throw PorkParser.ExitParser(e.error)
throw PorkParser.ExitParser()
} catch (e: ParseError) {
marker.error(e.error)
while (!builder.eof()) {
builder.advanceLexer()
}
marker.error(e.error)
throw PorkParser.ExitParser(e.error)
throw PorkParser.ExitParser()
} catch (e: PorkParser.ExitParser) {
if (e.error != null) {
marker.error(e.error)
throw e
} else {
marker.done(PorkElementTypes.FailedToParse)
}
throw PorkParser.ExitParser()
}
}
}