diff options
Diffstat (limited to 'parser')
| -rw-r--r-- | parser/parser.odin | 51 |
1 files changed, 26 insertions, 25 deletions
diff --git a/parser/parser.odin b/parser/parser.odin index 289ba1f..f3efbd5 100644 --- a/parser/parser.odin +++ b/parser/parser.odin @@ -14,6 +14,7 @@ Parser :: struct { errors: [dynamic]string, } + new :: proc(l: ^lexer.Lexer) -> Parser { p := Parser{l, token.Illegal{}, token.Illegal{}, make([dynamic]string, context.temp_allocator)} next_token(&p) @@ -21,8 +22,29 @@ new :: proc(l: ^lexer.Lexer) -> Parser { return p } -errors :: proc(p: ^Parser) -> []string { - return p.errors[:] +next_token :: proc(p: ^Parser) { + p.cur_token = p.peek_token + p.peek_token = lexer.next_token(p.l) +} + +cur_token_is :: proc(p: ^Parser, $T: typeid) -> bool { + _, ok := p.cur_token.(T) + return ok +} + +peek_token_is :: proc(p: ^Parser, $T: typeid) -> bool { + _, ok := p.peek_token.(T) + return ok +} + +expect_peek :: proc(p: ^Parser, $T: typeid) -> bool { + if peek_token_is(p, T) { + next_token(p) + return true + } else { + peek_error(p, T) + return false + } } peek_error :: proc(p: ^Parser, $T: typeid) { @@ -30,9 +52,8 @@ peek_error :: proc(p: ^Parser, $T: typeid) { append(&p.errors, msg) } -next_token :: proc(p: ^Parser) { - p.cur_token = p.peek_token - p.peek_token = lexer.next_token(p.l) +errors :: proc(p: ^Parser) -> []string { + return p.errors[:] } parse_program :: proc(p: ^Parser) -> ast.Program { @@ -91,25 +112,6 @@ parse_return_statement :: proc(p: ^Parser) -> (stmt: ast.Return_Statement, ok: b return } -cur_token_is :: proc(p: ^Parser, $T: typeid) -> bool { - _, ok := p.cur_token.(T) - return ok -} - -peek_token_is :: proc(p: ^Parser, $T: typeid) -> bool { - _, ok := p.peek_token.(T) - return ok -} - -expect_peek :: proc(p: ^Parser, $T: typeid) -> bool { - if peek_token_is(p, T) { - next_token(p) - return true - } else { - peek_error(p, T) - return false - } -} @(test) test_let_statements :: proc(t: ^testing.T) { @@ -179,4 +181,3 @@ check_parse_errors :: proc(t: ^testing.T, p: ^Parser) { testing.fail_now(t) } - |
