Skip to content

Commit 25aa80e

Browse files
author
TheDevConnor
committed
Fixed some small tc issues that are now fixed
1 parent 868a7b4 commit 25aa80e

9 files changed

Lines changed: 271 additions & 164 deletions

File tree

LPBS/ast.lx

Lines changed: 1 addition & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -168,53 +168,4 @@ pub const free_stmt -> fn (node: *Stmt) void {
168168
}
169169

170170
free(node);
171-
}
172-
173-
pub const print_expr -> fn (node: *Expr) void {
174-
if (node == cast<*Expr>(0)) { return; }
175-
176-
if (node.type == ExprKind::EXPR_NUMBER) {
177-
let num_node: *Number = cast<*Number>(node);
178-
output(num_node.value);
179-
} elif (node.type == ExprKind::EXPR_IDENT) {
180-
let ident_node: *Ident = cast<*Ident>(node);
181-
output(ident_node.name);
182-
} elif (node.type == ExprKind::EXPR_STRING) {
183-
let str_node: *StringLit = cast<*StringLit>(node);
184-
output("''", str_node.value, "''");
185-
} elif (node.type == ExprKind::EXPR_BINARY) {
186-
let bin_node: *Binary = cast<*Binary>(node);
187-
let binop: *char = string::from_char(bin_node.op);
188-
defer { free(binop); }
189-
190-
output("(");
191-
print_expr(bin_node.left);
192-
output(" ", binop, " ");
193-
print_expr(bin_node.right);
194-
output(")");
195-
} elif (node.type == ExprKind::EXPR_UNARY) {
196-
let unary_node: *Unary = cast<*Unary>(node);
197-
let unop: *char = string::from_char(unary_node.op);
198-
defer { free(unop); }
199-
200-
output(unop);
201-
print_expr(unary_node.operand);
202-
} elif (node.type == ExprKind::EXPR_GROUP) {
203-
let group_node: *Group = cast<*Group>(node);
204-
205-
output("(");
206-
print_expr(group_node.expr);
207-
output(")");
208-
}
209-
}
210-
211-
pub const print_stmt -> fn (node: *Stmt) void {
212-
if (node == cast<*Stmt>(0)) { return; }
213-
214-
if (node.type == StmtKind::STMT_PROGRAM) {
215-
let program_node: *Program = cast<*Program>(node);
216-
print_expr(program_node.nodes);
217-
}
218-
219-
output("\n");
220-
}
171+
}

LPBS/ast_helper.lx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
@module "ast_helper"
2+
3+
@use "string" as string
4+
@use "ast" as ast
5+
6+
pub const print_expr -> fn (node: *Expr) void {
7+
if (node == cast<*Expr>(0)) { return; }
8+
9+
if (node.type == ast::ExprKind::EXPR_NUMBER) {
10+
let num_node: *Number = cast<*Number>(node);
11+
output(num_node.value);
12+
} elif (node.type == ast::ExprKind::EXPR_IDENT) {
13+
let ident_node: *Ident = cast<*Ident>(node);
14+
output(ident_node.name);
15+
} elif (node.type == ast::ExprKind::EXPR_STRING) {
16+
let str_node: *StringLit = cast<*StringLit>(node);
17+
output("''", str_node.value, "''");
18+
} elif (node.type == ast::ExprKind::EXPR_BINARY) {
19+
let bin_node: *Binary = cast<*Binary>(node);
20+
let binop: *char = string::from_char(bin_node.op);
21+
defer { free(binop); }
22+
23+
output("(");
24+
print_expr(bin_node.left);
25+
output(" ", binop, " ");
26+
print_expr(bin_node.right);
27+
output(")");
28+
} elif (node.type == ast::ExprKind::EXPR_UNARY) {
29+
let unary_node: *Unary = cast<*Unary>(node);
30+
let unop: *char = string::from_char(unary_node.op);
31+
defer { free(unop); }
32+
33+
output(unop);
34+
print_expr(unary_node.operand);
35+
} elif (node.type == ast::ExprKind::EXPR_GROUP) {
36+
let group_node: *Group = cast<*Group>(node);
37+
38+
output("(");
39+
print_expr(group_node.expr);
40+
output(")");
41+
}
42+
}
43+
44+
pub const print_stmt -> fn (node: *Stmt) void {
45+
if (node == cast<*Stmt>(0)) { return; }
46+
47+
if (node.type == ast::StmtKind::STMT_PROGRAM) {
48+
let program_node: *Program = cast<*Program>(node);
49+
print_expr(program_node.nodes);
50+
}
51+
52+
output("\n");
53+
}

LPBS/main.lx

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,24 @@
11
@module "main"
22

3-
@use "string" as string
3+
@use "ast_helper" as ast_helper
44
@use "lexer" as lexer
55
@use "parser" as psr
66
@use "time" as time
77
@use "ast" as ast
88
@use "io" as io
99

10-
#takes_ownership
11-
const clean_up -> fn (path: *char, lex: *Token) void {
12-
free(path);
13-
lexer::free_tokens(lex);
14-
}
15-
1610
pub const main -> fn () int {
1711
let speed: Timer = time::timer_start();
1812

1913
let path: *char = "/home/TheDevConnor/Luma/LPBS/build.lmb";
2014
let file: *char = io::read_file(path);
21-
let lex: *lexer::Token = lexer::scan(file);
15+
let lex: *Token = lexer::scan(file);
2216

23-
let parser: *ast::Stmt = psr::parse(lex, path);
24-
ast::print_stmt(parser);
17+
let parser: *Stmt = psr::parse(lex, path);
18+
ast_helper::print_stmt(parser);
2519

26-
clean_up(file, lex);
20+
free(file);
21+
lexer::free_tokens(lex);
2722
ast::free_stmt(parser);
2823

2924
let elapsed: int = time::timer_elapsed_ms(speed);

LPBS/parser.lx

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,25 @@ const BindingPower -> enum {
2929
};
3030

3131
pub const Parser -> struct {
32-
tks: *lexer::Token,
32+
tks: *Token,
3333
path: *char,
3434
pos: int,
3535

36-
init_parser -> fn (tks: *lexer::Token, path: *char) void {
36+
init_parser -> fn (tks: *Token, path: *char) void {
3737
self.path = path;
3838
self.tks = tks;
3939
self.pos = 0;
4040
},
4141
};
4242

43-
// TODO: Add in resolution types for namespaces/modules ex: *ast::Expr, ast::NodeType,
43+
// TODO: Add in resolution types for namespaces/modules ex: *Expr, ast::NodeType,
4444
// TODO: and fix the types for the module system for enums and structs with it.
4545

4646
const at_end -> fn (psr: *Parser) int { return cast<int>(psr.pos >= psr.tks.size); }
47-
const peek -> fn (psr: *Parser) lexer::Token { return psr.tks.list[psr.pos]; }
47+
const peek -> fn (psr: *Parser) Token { return psr.tks.list[psr.pos]; }
4848
const advance -> fn (psr: *Parser) void { psr.pos = psr.pos + 1; }
4949

50-
const parse_expr -> fn (psr: *Parser, bp: int) *ast::Expr;
50+
const parse_expr -> fn (psr: *Parser, bp: int) *Expr;
5151

5252
const get_infix_bp -> fn (token_type: int) int {
5353
switch (token_type) {
@@ -57,8 +57,8 @@ const get_infix_bp -> fn (token_type: int) int {
5757
}
5858
}
5959

60-
const parse_literal -> fn (psr: *Parser) *ast::Expr {
61-
let tok: lexer::Token = peek(psr);
60+
const parse_literal -> fn (psr: *Parser) *Expr {
61+
let tok: Token = peek(psr);
6262

6363
switch (tok.type) {
6464
0 -> { //number
@@ -83,15 +83,15 @@ const parse_literal -> fn (psr: *Parser) *ast::Expr {
8383
}
8484
}
8585

86-
const nud -> fn (psr: *Parser) *ast::Expr {
87-
let tok: lexer::Token = peek(psr);
86+
const nud -> fn (psr: *Parser) *Expr {
87+
let tok: Token = peek(psr);
8888

8989
switch (tok.type) {
9090
0, 1, 2 -> { return parse_literal(psr); } //number, ident, string
9191
6 -> { //(
9292
advance(psr);
93-
let expr: *ast::Expr = parse_expr(psr, BindingPower::BP_NONE);
94-
let next_tok: lexer::Token = peek(psr);
93+
let expr: *Expr = parse_expr(psr, BindingPower::BP_NONE);
94+
let next_tok: Token = peek(psr);
9595
if (next_tok.type != 7) { //)
9696
output("Expected closing parenthesis\n");
9797
return cast<*Expr>(0);
@@ -102,37 +102,37 @@ const nud -> fn (psr: *Parser) *ast::Expr {
102102
16, 17 -> { //+, -
103103
let op: *char = tok.value;
104104
advance(psr);
105-
let right: *ast::Expr = parse_expr(psr, BindingPower::BP_UNARY);
105+
let right: *Expr = parse_expr(psr, BindingPower::BP_UNARY);
106106
return ast::create_unary_node(op[0], right);
107107
}
108108
_ -> {
109109
output("Unexpected token in prefix position\n");
110-
return cast<*ast::Expr>(0);
110+
return cast<*Expr>(0);
111111
}
112112
}
113113
}
114114

115-
const led -> fn (psr: *Parser, left: *ast::Expr, token: lexer::Token) *ast::Expr {
115+
const led -> fn (psr: *Parser, left: *Expr, token: Token) *Expr {
116116
switch (token.type) {
117117
12, 13, 16, 17, 18, 19 -> { //==, !=, +, -, *, /
118118
let op: *char = psr.tks.list[psr.pos].value;
119119
advance(psr);
120-
let right: *ast::Expr = parse_expr(psr, get_infix_bp(token.type));
120+
let right: *Expr = parse_expr(psr, get_infix_bp(token.type));
121121
return ast::create_binary_node(op[0], left, right);
122122
}
123123
_ -> {
124124
output("Unexpected token in infix position\n");
125-
return cast<*ast::Expr>(0);
125+
return cast<*Expr>(0);
126126
}
127127
}
128128
}
129129

130-
const parse_expr -> fn (psr: *Parser, bp: int) *ast::Expr {
131-
let left: *ast::Expr = nud(psr);
130+
const parse_expr -> fn (psr: *Parser, bp: int) *Expr {
131+
let left: *Expr = nud(psr);
132132

133133
// Inline the led logic here
134134
loop (at_end(psr) == 0 && bp < get_infix_bp(peek(psr).type)) {
135-
let tok: lexer::Token = peek(psr);
135+
let tok: Token = peek(psr);
136136
let next_bp: int = get_infix_bp(tok.type);
137137

138138
left = led(psr, left, tok);
@@ -141,11 +141,11 @@ const parse_expr -> fn (psr: *Parser, bp: int) *ast::Expr {
141141
return left;
142142
}
143143

144-
pub const parse -> fn (tks: *lexer::Token, path: *char) *ast::Stmt {
144+
pub const parse -> fn (tks: *Token, path: *char) *Stmt {
145145
let psr: Parser;
146146
psr.init_parser(tks, path);
147147

148-
let node: *ast::Expr = parse_expr(&psr, BindingPower::BP_NONE);
148+
let node: *Expr = parse_expr(&psr, BindingPower::BP_NONE);
149149

150150
return ast::create_program_node(node);
151151
}

0 commit comments

Comments
 (0)