Compare commits
3 Commits
5f8d9da6fa
...
20e5c2339f
Author | SHA1 | Date |
---|---|---|
Luna | 20e5c2339f | |
Luna | e0d712cd9f | |
Luna | a72346b888 |
|
@ -53,4 +53,4 @@ fn main(a int) int {
|
||||||
v()()()
|
v()()()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn voidfunc() {}
|
fn (v Typ) voidfunc() {}
|
||||||
|
|
|
@ -22,11 +22,18 @@ pub const ParamDecl = struct {
|
||||||
typ: Token,
|
typ: Token,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const MethodData = struct {
|
||||||
|
variable: Token,
|
||||||
|
typ: Token,
|
||||||
|
mutable: bool,
|
||||||
|
};
|
||||||
|
|
||||||
pub const FnDecl = struct {
|
pub const FnDecl = struct {
|
||||||
func_name: Token,
|
func_name: Token,
|
||||||
params: ParamList,
|
params: ParamList,
|
||||||
return_type: Token,
|
return_type: Token,
|
||||||
body: StmtList,
|
body: StmtList,
|
||||||
|
method: ?*MethodData,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const SingleConst = struct {
|
pub const SingleConst = struct {
|
||||||
|
|
|
@ -37,14 +37,31 @@ fn printBlock(ident: usize, block: var, endNewline: bool) void {
|
||||||
pub fn printNode(node: *Node, ident: usize) void {
|
pub fn printNode(node: *Node, ident: usize) void {
|
||||||
switch (node.*) {
|
switch (node.*) {
|
||||||
.FnDecl => |decl| {
|
.FnDecl => |decl| {
|
||||||
print(ident, "(fn {} (", decl.func_name.lexeme);
|
const name = decl.func_name.lexeme;
|
||||||
|
|
||||||
|
printIdent(ident);
|
||||||
|
|
||||||
|
// TODO print return types
|
||||||
|
|
||||||
|
if (decl.method) |method| {
|
||||||
|
const vari = method.variable.lexeme;
|
||||||
|
const typ = method.typ.lexeme;
|
||||||
|
|
||||||
|
if (method.mutable) {
|
||||||
|
warn("(method mut {} {} {} ", vari, typ, name);
|
||||||
|
} else {
|
||||||
|
warn("(method {} {} {} ", vari, typ, name);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
warn("(fn {} (", name);
|
||||||
|
}
|
||||||
|
|
||||||
for (decl.params.toSlice()) |param| {
|
for (decl.params.toSlice()) |param| {
|
||||||
std.debug.warn("({} {}) ", param.name.lexeme, param.typ.lexeme);
|
warn("({} {}) ", param.name.lexeme, param.typ.lexeme);
|
||||||
}
|
}
|
||||||
|
|
||||||
printBlock(ident + 1, decl.body, false);
|
printBlock(ident + 1, decl.body, false);
|
||||||
std.debug.warn(")\n");
|
warn(")\n");
|
||||||
},
|
},
|
||||||
|
|
||||||
.ConstDecl => |consts| {
|
.ConstDecl => |consts| {
|
||||||
|
|
|
@ -139,6 +139,7 @@ pub const Parser = struct {
|
||||||
params: ast.ParamList,
|
params: ast.ParamList,
|
||||||
return_type: Token,
|
return_type: Token,
|
||||||
block: ast.StmtList,
|
block: ast.StmtList,
|
||||||
|
method: ?*ast.MethodData,
|
||||||
) !*ast.Node {
|
) !*ast.Node {
|
||||||
var node = try self.allocator.create(Node);
|
var node = try self.allocator.create(Node);
|
||||||
node.* = Node{
|
node.* = Node{
|
||||||
|
@ -147,6 +148,7 @@ pub const Parser = struct {
|
||||||
.params = params,
|
.params = params,
|
||||||
.return_type = return_type,
|
.return_type = return_type,
|
||||||
.body = block,
|
.body = block,
|
||||||
|
.method = method,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
return node;
|
return node;
|
||||||
|
@ -389,22 +391,12 @@ pub const Parser = struct {
|
||||||
var param_list = ast.ParamList.init(self.allocator);
|
var param_list = ast.ParamList.init(self.allocator);
|
||||||
errdefer param_list.deinit();
|
errdefer param_list.deinit();
|
||||||
|
|
||||||
|
var method: ?*ast.MethodData = null;
|
||||||
|
|
||||||
_ = try self.consumeSingle(.Fn);
|
_ = try self.consumeSingle(.Fn);
|
||||||
|
|
||||||
if (self.check(.LeftParen)) {
|
if (self.check(.LeftParen)) {
|
||||||
_ = try self.consume(.LeftParen);
|
method = try self.parsePreMethod();
|
||||||
|
|
||||||
var mutable_ref: bool = false;
|
|
||||||
const method_var = try self.consume(.Identifier);
|
|
||||||
|
|
||||||
if (self.check(.Mut)) {
|
|
||||||
_ = try self.consume(.Mut);
|
|
||||||
mutable_ref = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const method_typ = try self.consume(.Identifier);
|
|
||||||
|
|
||||||
_ = try self.consume(.RightParen);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const name = try self.consumeSingle(.Identifier);
|
const name = try self.consumeSingle(.Identifier);
|
||||||
|
@ -435,7 +427,35 @@ pub const Parser = struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
var block_node = try self.parseBlock();
|
var block_node = try self.parseBlock();
|
||||||
return try self.mkFnDecl(name, param_list, return_type, block_node.Block);
|
return try self.mkFnDecl(name, param_list, return_type, block_node.Block, method);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// parse the (v [mut] T) part of the method (defined here
|
||||||
|
/// as a premethod)
|
||||||
|
fn parsePreMethod(self: *@This()) !?*ast.MethodData {
|
||||||
|
_ = try self.consumeSingle(.LeftParen);
|
||||||
|
|
||||||
|
var mutable_ref: bool = false;
|
||||||
|
const variable = try self.consumeSingle(.Identifier);
|
||||||
|
|
||||||
|
if (self.check(.Mut)) {
|
||||||
|
_ = try self.consumeSingle(.Mut);
|
||||||
|
mutable_ref = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const typ = try self.consumeSingle(.Identifier);
|
||||||
|
|
||||||
|
_ = try self.consumeSingle(.RightParen);
|
||||||
|
|
||||||
|
// create method data and assign the values we got into it
|
||||||
|
var method = try self.allocator.create(ast.MethodData);
|
||||||
|
method.* = ast.MethodData{
|
||||||
|
.variable = variable,
|
||||||
|
.typ = typ,
|
||||||
|
.mutable = mutable_ref,
|
||||||
|
};
|
||||||
|
|
||||||
|
return method;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parseConstDecl(self: *@This()) !*Node {
|
fn parseConstDecl(self: *@This()) !*Node {
|
||||||
|
|
Loading…
Reference in New Issue