summaryrefslogtreecommitdiff
path: root/parser/parser.odin
diff options
context:
space:
mode:
Diffstat (limited to 'parser/parser.odin')
-rw-r--r--parser/parser.odin51
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)
}
-