parser: rewrite to be able to parse any node type on demand

This commit is contained in:
2023-09-13 19:29:23 -07:00
parent b42ca92d9f
commit 2307fdc0ed
9 changed files with 729 additions and 525 deletions

View File

@ -0,0 +1,66 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.ast
interface NodeParser {
fun parseBlock(): Block
fun parseExpression(): Expression
fun parseBooleanLiteral(): BooleanLiteral
fun parseBreak(): Break
fun parseCompilationUnit(): CompilationUnit
fun parseContinue(): Continue
fun parseDeclaration(): Declaration
fun parseDefinition(): Definition
fun parseDoubleLiteral(): DoubleLiteral
fun parseForIn(): ForIn
fun parseFunctionCall(): FunctionCall
fun parseFunctionDefinition(): FunctionDefinition
fun parseIf(): If
fun parseImportDeclaration(): ImportDeclaration
fun parseInfixOperation(): InfixOperation
fun parseIntegerLiteral(): IntegerLiteral
fun parseLetAssignment(): LetAssignment
fun parseLetDefinition(): LetDefinition
fun parseListLiteral(): ListLiteral
fun parseLongLiteral(): LongLiteral
fun parseNative(): Native
fun parseNoneLiteral(): NoneLiteral
fun parseParentheses(): Parentheses
fun parsePrefixOperation(): PrefixOperation
fun parseSetAssignment(): SetAssignment
fun parseStringLiteral(): StringLiteral
fun parseSuffixOperation(): SuffixOperation
fun parseSymbol(): Symbol
fun parseSymbolReference(): SymbolReference
fun parseVarAssignment(): VarAssignment
fun parseWhile(): While
}

View File

@ -0,0 +1,38 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.ast
fun NodeParser.parse(type: NodeType): Node =
when (type) {
NodeType.Expression -> parseExpression()
NodeType.Symbol -> parseSymbol()
NodeType.Declaration -> parseDeclaration()
NodeType.Definition -> parseDefinition()
NodeType.Block -> parseBlock()
NodeType.CompilationUnit -> parseCompilationUnit()
NodeType.LetAssignment -> parseLetAssignment()
NodeType.VarAssignment -> parseVarAssignment()
NodeType.SetAssignment -> parseSetAssignment()
NodeType.InfixOperation -> parseInfixOperation()
NodeType.BooleanLiteral -> parseBooleanLiteral()
NodeType.FunctionCall -> parseFunctionCall()
NodeType.FunctionDefinition -> parseFunctionDefinition()
NodeType.LetDefinition -> parseLetDefinition()
NodeType.If -> parseIf()
NodeType.ImportDeclaration -> parseImportDeclaration()
NodeType.IntegerLiteral -> parseIntegerLiteral()
NodeType.LongLiteral -> parseLongLiteral()
NodeType.DoubleLiteral -> parseDoubleLiteral()
NodeType.ListLiteral -> parseListLiteral()
NodeType.Parentheses -> parseParentheses()
NodeType.PrefixOperation -> parsePrefixOperation()
NodeType.SuffixOperation -> parseSuffixOperation()
NodeType.StringLiteral -> parseStringLiteral()
NodeType.SymbolReference -> parseSymbolReference()
NodeType.While -> parseWhile()
NodeType.ForIn -> parseForIn()
NodeType.Break -> parseBreak()
NodeType.Continue -> parseContinue()
NodeType.NoneLiteral -> parseNoneLiteral()
NodeType.Native -> parseNative()
else -> throw RuntimeException("Unable to automatically parse type: ${type.name}")
}