Guest User

Untitled

a guest
Nov 10th, 2022
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 1.19 KB | None | 0 0
  1. import std/[strutils, strformat]
  2.  
  3. from ../token import Token, TokenKind
  4. from ast import ASTNodeKind, ASTNode, printNode
  5. import ../error_reporting
  6.  
  7. type Parser* = object
  8.     pos: int
  9.     tokens: seq[Token]
  10.  
  11.     tree: ASTNode
  12.  
  13. func initParser*(tokens: seq[Token]): Parser = Parser(pos: 0, tokens: tokens)
  14.  
  15. # Helpers
  16. func atEnd*(parser: Parser): bool = parser.pos >= parser.tokens.len
  17.  
  18. func advance*(parser: var Parser): Token =
  19.     if not parser.atEnd:
  20.         result = parser.tokens[parser.pos]
  21.  
  22.     parser.pos += 1
  23.  
  24. func peek*(parser: Parser): Token =
  25.     if not parser.atEnd:
  26.         result = parser.tokens[parser.pos]
  27.  
  28. func prev*(parser: Parser): Token = parser.tokens[parser.pos - 1]
  29.  
  30. func match*(parser: var Parser, tk: TokenKind): bool =
  31.     if not parser.atEnd and parser.peek.kind == tk:
  32.         discard parser.advance()
  33.         result = true
  34.  
  35. func consume*(parser: var Parser, tk: TokenKind, msg: string): Token =
  36.     ## Attempt to consume a token of the given kind, and raise an error if
  37.     ## we cannot for whatever reason
  38.     if not parser.atEnd and parser.peek.kind == tk:
  39.         result = parser.advance()
  40.  
  41.     raise parserError(parser.pos, parser.peek.kind, msg)
  42.  
  43.  
Add Comment
Please, Sign In to add comment