parser: fix integer literals

This commit is contained in:
Alex Zenla 2023-09-12 00:46:09 -04:00
parent 1b363dcf56
commit f64a54fa06
Signed by: alex
GPG Key ID: C0780728420EBFE5
4 changed files with 16 additions and 8 deletions

View File

@ -13,11 +13,11 @@ class Parser(source: PeekableSource<Token>, val attribution: NodeAttribution) {
} else { } else {
val integer = it.text.toIntOrNull() val integer = it.text.toIntOrNull()
if (integer != null) { if (integer != null) {
IntegerLiteral(integer) return@expect IntegerLiteral(integer)
} }
val long = it.text.toLongOrNull() val long = it.text.toLongOrNull()
if (long != null) { if (long != null) {
LongLiteral(long) return@expect LongLiteral(long)
} }
throw ParseError("Illegal integer value") throw ParseError("Illegal integer value")
} }

View File

@ -46,4 +46,6 @@ object PorkElementTypes {
fun elementTypeFor(nodeType: NodeType): IElementType = fun elementTypeFor(nodeType: NodeType): IElementType =
nodeTypeToElementType[nodeType]!! nodeTypeToElementType[nodeType]!!
val FailedToParse: IElementType = IElementType("FailedToParse", PorkLanguage)
} }

View File

@ -17,5 +17,7 @@ class PorkParser : PsiParser {
return builder.treeBuilt 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"
)
} }

View File

@ -17,16 +17,20 @@ class PsiBuilderMarkAttribution(val builder: PsiBuilder) : ParserNodeAttribution
while (!builder.eof()) { while (!builder.eof()) {
builder.advanceLexer() builder.advanceLexer()
} }
throw PorkParser.ExitParser(e.error) throw PorkParser.ExitParser()
} catch (e: ParseError) { } catch (e: ParseError) {
marker.error(e.error)
while (!builder.eof()) { while (!builder.eof()) {
builder.advanceLexer() builder.advanceLexer()
} }
marker.error(e.error) throw PorkParser.ExitParser()
throw PorkParser.ExitParser(e.error)
} catch (e: PorkParser.ExitParser) { } catch (e: PorkParser.ExitParser) {
marker.error(e.error) if (e.error != null) {
throw e marker.error(e.error)
} else {
marker.done(PorkElementTypes.FailedToParse)
}
throw PorkParser.ExitParser()
} }
} }
} }