language: implement list indexing

This commit is contained in:
2023-09-17 08:38:11 -07:00
parent 3b101bd48a
commit a08526c92c
14 changed files with 90 additions and 0 deletions

View File

@ -78,6 +78,10 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
val infixOperator = ParserHelpers.convertInfixOperator(infixToken)
InfixOperation(expression, infixOperator, parseExpression())
}
} else if (next(TokenType.LeftBracket)) {
val index = parseExpression()
expect(TokenType.RightBracket)
IndexedBy(expression, index)
} else expression
}
@ -237,6 +241,14 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
ImportDeclaration(form, components)
}
override fun parseIndexedBy(): IndexedBy = guarded(NodeType.IndexedBy) {
val expression = parseExpression()
expect(TokenType.LeftBracket)
val index = parseExpression()
expect(TokenType.RightBracket)
IndexedBy(expression, index)
}
override fun parseInfixOperation(): InfixOperation = guarded(NodeType.InfixOperation) {
val infixToken = next()
val infixOperator = ParserHelpers.convertInfixOperator(infixToken)

View File

@ -233,6 +233,13 @@ class Printer(buffer: StringBuilder) : NodeVisitor<Unit> {
}
}
override fun visitIndexedBy(node: IndexedBy) {
visit(node.expression)
append("[")
visit(node.index)
append("]")
}
override fun visitCompilationUnit(node: CompilationUnit) {
for (declaration in node.declarations) {
visit(declaration)