authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-03-31 22:48:12+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-03-31 22:48:12+02:00
logdf09c01f7f141a384010d17ab23db3b36316f5b6
tree0905c2b50a3b17853c5b63e351f73a604e47d37f
parentaabf7cf57e62379d5f21aa013d0735c5427eace2

std.zig.parser now parses error, this and unreachable


2 files changed, 111 insertions(+), 0 deletions(-)

std/zig/ast.zig+63
......@@ -25,6 +25,9 @@ pub const Node = struct {
2525 BoolLiteral,
2626 NullLiteral,
2727 UndefinedLiteral,
28 ThisLiteral,
29 Unreachable,
30 ErrorType,
2831 BuiltinCall,
2932 Call,
3033 LineComment,
......@@ -49,6 +52,9 @@ pub const Node = struct {
4952 Id.BoolLiteral => @fieldParentPtr(NodeBoolLiteral, "base", base).iterate(index),
5053 Id.NullLiteral => @fieldParentPtr(NodeNullLiteral, "base", base).iterate(index),
5154 Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).iterate(index),
55 Id.ThisLiteral => @fieldParentPtr(NodeThisLiteral, "base", base).iterate(index),
56 Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).iterate(index),
57 Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).iterate(index),
5258 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).iterate(index),
5359 Id.Call => @fieldParentPtr(NodeCall, "base", base).iterate(index),
5460 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).iterate(index),
......@@ -74,6 +80,9 @@ pub const Node = struct {
7480 Id.BoolLiteral => @fieldParentPtr(NodeBoolLiteral, "base", base).firstToken(),
7581 Id.NullLiteral => @fieldParentPtr(NodeNullLiteral, "base", base).firstToken(),
7682 Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).firstToken(),
83 Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).firstToken(),
84 Id.ThisLiteral => @fieldParentPtr(NodeThisLiteral, "base", base).firstToken(),
85 Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).firstToken(),
7786 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).firstToken(),
7887 Id.Call => @fieldParentPtr(NodeCall, "base", base).firstToken(),
7988 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).firstToken(),
......@@ -99,6 +108,9 @@ pub const Node = struct {
99108 Id.BoolLiteral => @fieldParentPtr(NodeBoolLiteral, "base", base).lastToken(),
100109 Id.NullLiteral => @fieldParentPtr(NodeNullLiteral, "base", base).lastToken(),
101110 Id.UndefinedLiteral => @fieldParentPtr(NodeUndefinedLiteral, "base", base).lastToken(),
111 Id.ThisLiteral => @fieldParentPtr(NodeThisLiteral, "base", base).lastToken(),
112 Id.Unreachable => @fieldParentPtr(NodeUnreachable, "base", base).lastToken(),
113 Id.ErrorType => @fieldParentPtr(NodeErrorType, "base", base).lastToken(),
102114 Id.BuiltinCall => @fieldParentPtr(NodeBuiltinCall, "base", base).lastToken(),
103115 Id.Call => @fieldParentPtr(NodeCall, "base", base).lastToken(),
104116 Id.LineComment => @fieldParentPtr(NodeLineComment, "base", base).lastToken(),
......@@ -688,6 +700,57 @@ pub const NodeUndefinedLiteral = struct {
688700 }
689701};
690702
703pub const NodeThisLiteral = struct {
704 base: Node,
705 token: Token,
706
707 pub fn iterate(self: &NodeThisLiteral, index: usize) ?&Node {
708 return null;
709 }
710
711 pub fn firstToken(self: &NodeThisLiteral) Token {
712 return self.token;
713 }
714
715 pub fn lastToken(self: &NodeThisLiteral) Token {
716 return self.token;
717 }
718};
719
720pub const NodeUnreachable = struct {
721 base: Node,
722 token: Token,
723
724 pub fn iterate(self: &NodeUnreachable, index: usize) ?&Node {
725 return null;
726 }
727
728 pub fn firstToken(self: &NodeUnreachable) Token {
729 return self.token;
730 }
731
732 pub fn lastToken(self: &NodeUnreachable) Token {
733 return self.token;
734 }
735};
736
737pub const NodeErrorType = struct {
738 base: Node,
739 token: Token,
740
741 pub fn iterate(self: &NodeErrorType, index: usize) ?&Node {
742 return null;
743 }
744
745 pub fn firstToken(self: &NodeErrorType) Token {
746 return self.token;
747 }
748
749 pub fn lastToken(self: &NodeErrorType) Token {
750 return self.token;
751 }
752};
753
691754pub const NodeLineComment = struct {
692755 base: Node,
693756 lines: ArrayList(Token),
std/zig/parser.zig+48
......@@ -451,6 +451,42 @@ pub const Parser = struct {
451451 try stack.append(State.AfterOperand);
452452 continue;
453453 },
454 Token.Id.Keyword_this => {
455 const node = try arena.create(ast.NodeThisLiteral);
456 *node = ast.NodeThisLiteral {
457 .base = self.initNode(ast.Node.Id.ThisLiteral),
458 .token = token,
459 };
460 try stack.append(State {
461 .Operand = &node.base
462 });
463 try stack.append(State.AfterOperand);
464 continue;
465 },
466 Token.Id.Keyword_unreachable => {
467 const node = try arena.create(ast.NodeUnreachable);
468 *node = ast.NodeUnreachable {
469 .base = self.initNode(ast.Node.Id.Unreachable),
470 .token = token,
471 };
472 try stack.append(State {
473 .Operand = &node.base
474 });
475 try stack.append(State.AfterOperand);
476 continue;
477 },
478 Token.Id.Keyword_error => {
479 const node = try arena.create(ast.NodeErrorType);
480 *node = ast.NodeErrorType {
481 .base = self.initNode(ast.Node.Id.ErrorType),
482 .token = token,
483 };
484 try stack.append(State {
485 .Operand = &node.base
486 });
487 try stack.append(State.AfterOperand);
488 continue;
489 },
454490 Token.Id.Builtin => {
455491 const node = try arena.create(ast.NodeBuiltinCall);
456492 *node = ast.NodeBuiltinCall {
......@@ -1499,6 +1535,18 @@ pub const Parser = struct {
14991535 const null_literal = @fieldParentPtr(ast.NodeNullLiteral, "base", base);
15001536 try stream.print("{}", self.tokenizer.getTokenSlice(null_literal.token));
15011537 },
1538 ast.Node.Id.ThisLiteral => {
1539 const this_literal = @fieldParentPtr(ast.NodeThisLiteral, "base", base);
1540 try stream.print("{}", self.tokenizer.getTokenSlice(this_literal.token));
1541 },
1542 ast.Node.Id.Unreachable => {
1543 const unreachable_node = @fieldParentPtr(ast.NodeUnreachable, "base", base);
1544 try stream.print("{}", self.tokenizer.getTokenSlice(unreachable_node.token));
1545 },
1546 ast.Node.Id.ErrorType => {
1547 const error_type = @fieldParentPtr(ast.NodeErrorType, "base", base);
1548 try stream.print("{}", self.tokenizer.getTokenSlice(error_type.token));
1549 },
15021550 ast.Node.Id.MultilineStringLiteral => {
15031551 const multiline_str_literal = @fieldParentPtr(ast.NodeMultilineStringLiteral, "base", base);
15041552 try stream.print("\n");