annotate parser/Parser.d @ 160:6cb2f4201e2a

Improved static arrays Here is a list of some stuff that works char[3] s = "hey" char[3] s2 = s; s2[1] = 98 // no support for chars, but 98 = 'b' :) int[2] i; i[0] = 2; Still can't pass static arrays to functions
author Anders Halager <halager@gmail.com>
date Tue, 22 Jul 2008 13:29:20 +0200
parents 57b0b4464a0b
children 01c2c49775ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1 module parser.Parser;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
2
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
3 import lexer.Lexer,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
4 lexer.Token;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
5
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
6 import parser.Action;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
7
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
8 import basic.Message,
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
9 basic.Attribute;
21
0fb2d13dce37 Now working with gdc also (gdc use reverse paremeter validating on function calls)
johnsen@johnsen-laptop
parents: 12
diff changeset
10
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 84
diff changeset
11 import basic.SmallArray,
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 84
diff changeset
12 basic.SourceManager;
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
13
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
14 import tango.io.Stdout,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
15 Integer = tango.text.convert.Integer;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
16
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
17 class Parser
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
18 {
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
19 Action action;
89
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
20 MessageHandler messages;
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
21 alias Object Exp;
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
22 alias Object Stmt;
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
23 alias Object Decl;
94
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 92
diff changeset
24 alias Object Module;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
25
89
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
26 this(MessageHandler messages)
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
27 {
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
28 this.messages = messages;
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
29 }
a49bb982a7b0 Using the new SourceLocation system to handle errors. Also, this is the first push for making the errors don't throw, but continue to check the source.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
30
94
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 92
diff changeset
31 Module parse(SourceManager sm, Lexer lexer, Action act)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
32 {
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 84
diff changeset
33 this.sm = sm;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
34 this.lexer = lexer;
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 84
diff changeset
35 this.action = act;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
36
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
37 Module m;
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
38 if ( isa(Tok.Module) )
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
39 {
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
40 Token _module = next();
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
41 ModuleName name = parseModuleName();
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
42 m = action.actOnModule(_module, sm.getText(name.asRange()));
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
43 require(Tok.Seperator);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
44 }
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
45 else
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
46 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
47 SLoc loc = peek.location;
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
48 m = action.actOnImplicitModule(loc, sm.getFile(loc));
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
49 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
50
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
51 auto nes = parseAttributeInit;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
52 while( !isa(Tok.EOF) )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
53 {
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
54 while ( peek.isAttribute )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
55 nes ~= parseAttribute(nes[$-1]);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
56
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
57 foreach (d; parseDeclDef(nes[$-1].a))
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
58 action.actOnModuleDecl(m, d);
94
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 92
diff changeset
59
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
60 nes = parseAttributeScope(nes);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
61 }
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
62
94
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 92
diff changeset
63 return m;
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 92
diff changeset
64 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
65
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
66 private:
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
67 Decl[] parseDeclDef(Attribute a)
94
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 92
diff changeset
68 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
69 if ( isa (Tok.Import) )
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
70 return parseImports();
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
71
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
72 return [parseDecl(a)];
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
73 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
74
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
75 Decl parseDecl(Attribute att)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
76 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
77 Token t = peek;
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
78
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
79 if (t.isBasicType || t.isIdentifier)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
80 {
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
81 Id type;
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
82 Id iden;
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
83 int len = peekParseType;
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
84 if (peek(len).type == Tok.Identifier && len != 0)
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
85 {
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
86 type = parseType;
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
87 parseDeclAfterInvalidType:
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
88 iden = Id(require(Tok.Identifier));
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
89 if ( isa(Tok.Seperator) )
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
90 {
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
91 Token sep = next();
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
92 return action.actOnDeclarator(type, iden, null, att);
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
93 }
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
94 else if ( isa(Tok.Assign) )
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
95 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
96 Token assign = next();
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
97 Exp exp = parseExpression();
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
98 require(Tok.Seperator);
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
99 return action.actOnDeclarator(type, iden, exp, att);
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
100 }
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
101 else if ( isa(Tok.OpenParentheses) )
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
102 return parseFunc(type, iden, att);
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
103 else
154
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
104 {
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
105 auto n1 = next();
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
106 messages.report(UnexpectedTok, n1.location).arg(n1.getType);
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
107 }
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
108 return null;
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
109 }
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
110 t = peek(len);
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
111 messages.report(InvalidDeclType, t.location)
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
112 .arg(sm.getText(t.asRange));
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
113 while(len--)
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
114 next();
154
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
115 while( !isa(Tok.Identifier) && !isa(Tok.EOF))
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
116 next();
154
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
117 if ( isa(Tok.EOF ) )
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
118 messages.report(UnexpectedTok, t.location)
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
119 .fatal(ExitLevel.Parser);
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
120
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
121 type = Id(peek);
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
122 goto parseDeclAfterInvalidType;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
123 }
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
124 else if (t.type == Tok.Struct)
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
125 {
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
126 Id type = Id(next());
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
127 Id iden = Id(require(Tok.Identifier));
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
128
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
129 return parseStruct(type, iden, att);
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
130 }
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
131 else if (t.type == Tok.Class)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
132 {
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
133 Id type = Id(next());
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
134 Id iden = Id(require(Tok.Identifier));
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
135
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
136 return parseClass(type, iden, att);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
137 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
138 else if (t.type == Tok.Interface)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
139 {
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
140 Id type = Id(next());
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
141 Id iden = Id(require(Tok.Identifier));
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
142
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
143 return parseInterface(type, iden, att);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
144 }
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
145 messages.report(UnexpectedTok, t.location)
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
146 .arg(t.getType)
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
147 .arg(Tok.Identifier)
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 89
diff changeset
148 .fatal(ExitLevel.Parser);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
149 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
150
140
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
151 Extern parseLinkageType()
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
152 {
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
153 Extern e = Extern.D;
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
154 if(peek(1).type != Tok.OpenParentheses)
140
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
155 return e;
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
156
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
157 next(); next();
140
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
158
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
159 Token t = require(Tok.Identifier);
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
160
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
161 switch(sm.getText(t.asRange))
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
162 {
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
163 case "C":
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
164 if (peek(0).type == Tok.Plus &&
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
165 peek(1).type == Tok.Plus)
140
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
166 e = Extern.CPlusPlus;
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
167 else
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
168 e = Extern.C;
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
169 break;
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
170 case "D":
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
171 break;
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
172 case "Windows":
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
173 e = Extern.Windows;
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
174 break;
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
175 case "Pascal":
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
176 e = Extern.Pascal;
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
177 break;
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
178 case "System":
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
179 e = Extern.System;
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
180 break;
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
181 default:
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
182 messages.report(UnexpectedLinkType, t.location);
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
183 }
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
184
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
185 require(Tok.CloseParentheses);
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
186
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
187 return e;
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
188 }
927ae00bd9d2 Added support for extern keyword. Being ignored atm though. Also changed ast/Module, so that you can get a list of only vars, functions or structs.
Anders Johnsen <skabet@gmail.com>
parents: 136
diff changeset
189
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
190 /**
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
191 Parse a series of imports belonging to a single import token.
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
192 */
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
193 Decl[] parseImports()
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
194 {
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
195 Token _import = require(Tok.Import);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
196 SmallArray!(Decl) res;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
197 void addToRes(Decl d) { res ~= d; }
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
198
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
199 bool done = false;
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
200 while (!done && !isa(Tok.Seperator))
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
201 {
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
202 ModuleName mod = parseModuleName();
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
203 Token tok = peek;
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
204 switch (tok.type)
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
205 {
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
206 case Tok.Comma:
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
207 // import A, B.C;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
208 // parse another module-name
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
209 next();
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
210 res ~= action.actOnImport(_import, mod, null);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
211 break;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
212 case Tok.Assign:
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
213 // import B = A.A;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
214 // ^- must be a single identifier
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
215 // renamed import
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
216 if (mod.packages.length != 0)
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
217 {
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
218 SLoc loc = mod.packages[0].tok.location;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
219 messages.report(RenameMustBeSingleIdent, loc);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
220 }
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
221 //if (isStatic)
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
222 // error("Static imports cannot be renamed");
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
223 next();
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
224 Id name = mod.id;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
225 mod = parseModuleName();
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
226 // create from mod and rename to `name`
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
227 res ~= action.actOnImport(_import, mod, &name);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
228 break;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
229 case Tok.Colon:
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
230 // import A : a;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
231 // selective imports, potentially import A : print = a
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
232 next();
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
233 Decl d = action.actOnImport(_import, mod, null);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
234 // do-while on a comma:
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
235 // add explicit symbol
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
236 do
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
237 {
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
238 Id sym = parseIdentifier();
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
239 Id dummy;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
240 Id* name = null;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
241 if (skip(Tok.Assign))
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
242 {
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
243 dummy = sym;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
244 name = &dummy;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
245 sym = parseIdentifier();
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
246 }
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
247 action.addSelectiveImport(d, sym, name);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
248
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
249 } while (skip(Tok.Comma));
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
250 require(Tok.Seperator);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
251 res ~= d;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
252 return res.safe();
100
5f258eaf9517 Loading modules in. Just need to add them to the scope of the "main" Module now.
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
253 case Tok.Seperator:
5f258eaf9517 Loading modules in. Just need to add them to the scope of the "main" Module now.
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
254 done = true;
5f258eaf9517 Loading modules in. Just need to add them to the scope of the "main" Module now.
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
255 break;
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
256 default:
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
257 goto Lerror;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
258 }
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
259 res ~= action.actOnImport(_import, mod, null);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
260 }
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
261
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
262 require(Tok.Seperator);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
263 return res.safe();
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
264 Lerror:
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
265 while (!isa (Tok.Seperator))
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
266 next();
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
267 return res.safe();
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
268 }
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
269
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
270 /**
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
271 Parse interface
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
272 */
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
273 Decl parseInterface(Id type, Id iden, Attribute att)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
274 {
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
275 auto decl = action.actOnDeclarator(type, iden, null, att);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
276
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
277 if (peek.type == Tok.Colon)
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
278 // SuperInterfaces
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
279 {
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
280 next(); // Remove colon.
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
281
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
282 Id identifier;
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
283
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
284 // The identifier
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
285 identifier = Id(require(Tok.Identifier));
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
286
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
287 action.actOnInterfaceBaseClass(decl, identifier);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
288
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
289 // We should now have an optional list of items, each starting ','
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
290 while (peek.type == Tok.Comma)
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
291 {
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
292 next(); // Remove comma
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
293
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
294 // The identifier
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
295 identifier = Id(require(Tok.Identifier));
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
296
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
297 action.actOnInterfaceBaseClass(decl, identifier);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
298 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
299 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
300
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
301 require(Tok.OpenBrace);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
302
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
303 auto nes = parseAttributeInit;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
304 while( !isa(Tok.EOF) && !isa(Tok.CloseBrace) )
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
305 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
306 while ( peek.isAttribute )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
307 nes ~= parseAttribute(nes[$-1]);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
308
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
309 auto m_decl = parseDecl(nes[$-1].a);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
310 action.actOnInterfaceMember(decl, m_decl);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
311
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
312 nes = parseAttributeScope(nes);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
313 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
314
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
315 require(Tok.CloseBrace);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
316
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
317 return decl;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
318 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
319
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
320 /**
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
321 Parse class
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
322 */
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
323 Decl parseClass(Id type, Id iden, Attribute att)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
324 {
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
325 auto decl = action.actOnDeclarator(type, iden, null, att);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
326
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
327 if (peek.type == Tok.Colon)
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
328 // BaseClassList - Super class and interfaces(in that order)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
329 {
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
330 next(); // Remove colon.
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
331
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
332 Token protection;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
333 Id identifier;
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
334
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
335 // First we expect an optional protection level.
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
336 if (peek.isBaseClassProtection)
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
337 protection = next();
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
338 // Then the identifier
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
339 identifier = Id(require(Tok.Identifier));
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
340
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
341 action.actOnClassBaseClass(decl, identifier);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
342
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
343 // We should now have an optional list of items, each starting ','
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
344 while (peek.type == Tok.Comma)
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
345 {
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
346 next(); // Remove comma
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
347
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
348 // First we expect an optional protection level.
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
349 if (peek.isBaseClassProtection)
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
350 protection = next();
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
351 // Then the identifier
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
352 identifier = Id(require(Tok.Identifier));
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
353
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
354 action.actOnClassBaseClass(decl, identifier);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
355 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
356 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
357
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
358 require(Tok.OpenBrace);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
359
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
360 auto nes = parseAttributeInit;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
361 while( !isa(Tok.EOF) && !isa(Tok.CloseBrace) )
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
362 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
363 while ( peek.isAttribute )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
364 nes ~= parseAttribute(nes[$-1]);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
365
154
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
366 switch(peek.type)
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
367 {
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
368 case Tok.This:
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
369 auto id = Id(next);
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
370 auto m_decl = parseFunc(iden, id, nes[$-1].a);
158
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
371 action.actOnClassMember(decl, m_decl);
154
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
372 break;
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
373
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
374 default:
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
375 auto m_decl = parseDecl(nes[$-1].a);
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
376 action.actOnClassMember(decl, m_decl);
0ea5d2f3e96b Parsing "this" as constructor. Also removed regex from the test run program(seg fault - dmd???)
Anders Johnsen <skabet@gmail.com>
parents: 152
diff changeset
377 }
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
378
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
379 nes = parseAttributeScope(nes);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
380 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
381
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
382 require(Tok.CloseBrace);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
383
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
384 return decl;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
385 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
386
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
387 /**
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
388 Parse struct
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
389 */
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
390 Decl parseStruct(Id type, Id iden, Attribute att)
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
391 {
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
392 auto decl = action.actOnDeclarator(type, iden, null, att);
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
393
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
394 require(Tok.OpenBrace);
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
395
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
396 auto nes = parseAttributeInit;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
397 while( !isa(Tok.EOF) && !isa(Tok.CloseBrace) )
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
398 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
399 while ( peek.isAttribute )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
400 nes ~= parseAttribute(nes[$-1]);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
401
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
402 auto m_decl = parseDecl(nes[$-1].a);
102
cd066f3b539a Parsing methods in structs - error on semantics though.
Anders Johnsen <skabet@gmail.com>
parents: 100
diff changeset
403 action.actOnStructMember(decl, m_decl);
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
404
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
405 nes = parseAttributeScope(nes);
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
406 }
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
407
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
408 require(Tok.CloseBrace);
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
409
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
410 return decl;
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 51
diff changeset
411 }
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
412
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
413 Att[] parseAttributeInit()
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
414 {
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
415 Att[] nes;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
416 nes ~= Att();
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
417 nes[0].nested = Scope;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
418 return nes;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
419 }
28
69464d465284 Now supporting structs - both read and write. Still a few errors though, so watch out.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
420
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
421 Att[] parseAttributeScope(Att[] nes)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
422 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
423 while ( nes[$-1].nested == Single )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
424 nes.length = nes.length - 1;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
425
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
426 while ( isa(Tok.CloseBrace) && nes.length > 1)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
427 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
428 while ( nes.length > 1 )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
429 {
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
430 if( nes[$-1].nested == Scope )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
431 {
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
432 nes.length = nes.length - 1;
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
433 next();
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
434 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
435 }
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
436 nes.length = nes.length - 1;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
437 }
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
438 }
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
439
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
440 return nes;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
441 }
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
442
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
443 Att parseAttribute(Att last)
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
444 {
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
445 Att _parseAttribute(Att last)
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
446 {
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
447 Att a = last;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
448 a.nested = Single;
5
2c5a8f4c254a Added very simple if support.
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
449
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
450 switch(peek.type)
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
451 {
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
452 case Tok.Public:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
453 a.a.setProtection(Protection.Public);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
454 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
455 case Tok.Private:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
456 a.a.setProtection(Protection.Private);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
457 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
458 case Tok.Package:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
459 a.a.setProtection(Protection.Package);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
460 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
461 case Tok.Protected:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
462 a.a.setProtection(Protection.Protected);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
463 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
464 case Tok.Export:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
465 a.a.setProtection(Protection.Export);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
466 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
467 case Tok.Static:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
468 a.a.setStatic;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
469 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
470 case Tok.Final:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
471 a.a.setFinal;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
472 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
473 case Tok.Const:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
474 a.a.setConst;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
475 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
476 case Tok.Abstract:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
477 a.a.setAbstract;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
478 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
479 case Tok.Override:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
480 a.a.setOverride;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
481 break;
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
482 case Tok.Deprecated:
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
483 a.a.setDeprecated;
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
484 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
485 case Tok.Auto:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
486 a.a.setAuto;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
487 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
488 case Tok.Extern:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
489 Extern e = parseLinkageType;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
490 a.a.setExtern(e);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
491 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
492 }
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
493 next();
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
494
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
495 return a;
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
496 }
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
497
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
498 Att a = _parseAttribute(last);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
499
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
500 while (peek.isAttribute)
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
501 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
502 a = parseAttribute(a);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
503 }
45
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
504
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
505 if (peek.type == Tok.Colon)
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
506 {
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
507 a.nested = All;
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
508 next();
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
509 }
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
510 else if (peek.type == Tok.OpenBrace)
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
511 {
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
512 a.nested = Scope;
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
513 next();
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
514 }
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
515
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
516 return a;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
517 }
45
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
518
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
519 enum : uint
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
520 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
521 Single,
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
522 Scope,
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
523 All
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
524 }
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
525
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
526 struct Att
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
527 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
528 Attribute a;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
529 uint nested;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
530 }
45
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
531
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
532 /**
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
533 Parse statements.
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
534
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
535 This is the place to attack!
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
536 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
537 Stmt parseStatement()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
538 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
539 Token t = peek;
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
540
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
541 if (t.isReturn)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
542 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
543 Token ret = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
544 Exp exp;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
545 if (peek.type != Tok.Seperator)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
546 exp = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
547 require(Tok.Seperator);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
548 return action.actOnReturnStmt(ret, exp);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
549 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
550 /*
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
551 if (cond)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
552 single statement | compound statement
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
553 [else
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
554 single statement | compound statement]
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
555 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
556 else if (t.isIf)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
557 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
558 Token _if = next();
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
559
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
560 require(Tok.OpenParentheses);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
561 Exp cond = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
562 require(Tok.CloseParentheses);
45
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
563
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
564 Stmt thenB = parseSingleOrCompoundStatement();
5
2c5a8f4c254a Added very simple if support.
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
565
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
566 // if there is no else part we use the if as token, to have
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
567 // something than can be passed along
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
568 Token _else = _if;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
569 Stmt elseB;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
570 if (peek.type == Tok.Else)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
571 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
572 _else = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
573 elseB = parseSingleOrCompoundStatement();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
574 }
48
b6c1dc30ca4b Only tests that dont pass now are structs and switches
Anders Halager <halager@gmail.com>
parents: 47
diff changeset
575
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
576 return action.actOnIfStmt(_if, cond, thenB, _else, elseB);
146
8c09fdaa724e Parsing for-loop.
Anders Johnsen <skabet@gmail.com>
parents: 144
diff changeset
577
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
578 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
579 /*
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
580 while (cond)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
581 single statement | compound statement
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
582 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
583 else if (t.isWhile)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
584 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
585 Token _while = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
586 require(Tok.OpenParentheses);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
587 Exp cond = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
588 require(Tok.CloseParentheses);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
589 Stmt bodyStmt = parseSingleOrCompoundStatement();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
590 return action.actOnWhileStmt(_while, cond, bodyStmt);
146
8c09fdaa724e Parsing for-loop.
Anders Johnsen <skabet@gmail.com>
parents: 144
diff changeset
591
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
592 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
593 else if (t.isFor)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
594 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
595 Token _for = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
596 require(Tok.OpenParentheses);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
597 Stmt init;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
598 if ( isa(Tok.Seperator))
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
599 require(Tok.Seperator);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
600 else
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
601 init = parseStatement();
146
8c09fdaa724e Parsing for-loop.
Anders Johnsen <skabet@gmail.com>
parents: 144
diff changeset
602
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
603 Exp cond;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
604 if ( !isa(Tok.Seperator))
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
605 cond = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
606 require(Tok.Seperator);
84
cc05c041e6a3 Assign stuff to arrays.
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
607
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
608 Exp incre;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
609 if ( !isa(Tok.CloseParentheses))
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
610 incre = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
611 require(Tok.CloseParentheses);
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
612
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
613 Stmt bodyStmt = parseSingleOrCompoundStatement();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
614 return action.actOnForStmt(_for, init, cond, incre, bodyStmt);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
615 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
616 else if (t.isBasicType || t.isIdentifier)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
617 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
618 Token iden = peek;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
619 Token n = peek(1);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
620 // Must be an decl, if we start with a basic type, or two
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
621 // identifiers in a row
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
622 if ( n.type == Tok.Star || n.type == Tok.OpenBracket)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
623 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
624 int len = peekParseType;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
625 if(peek(len).type == Tok.Identifier && len != 0)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
626 return action.actOnDeclStmt(parseVarDecl());
76
9171f04dd9ee Now parsing varDecls a lot nicer!
Anders Johnsen <skabet@gmail.com>
parents: 75
diff changeset
627
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
628 Exp exp = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
629 require(Tok.Seperator);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
630 return action.actOnExprStmt(exp);
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
631 }
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
632
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
633 if (n.isIdentifier())
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
634 return action.actOnDeclStmt(parseVarDecl());
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
635
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
636 // Expression: a.b, a = b, a(b) etc.
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
637 Exp exp = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
638 require(Tok.Seperator);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
639 return action.actOnExprStmt(exp);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
640 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
641 else if (t.isSwitch)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
642 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
643 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
644 require(Tok.OpenParentheses);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
645 auto target = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
646 auto res = action.actOnStartOfSwitchStmt(t, target);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
647 require(Tok.CloseParentheses);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
648 require(Tok.OpenBrace);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
649 while (true)
151
Anders Halager <halager@gmail.com>
parents: 150 148
diff changeset
650 {
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
651 Stmt[] statements;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
652 if (isa(Tok.Default))
151
Anders Halager <halager@gmail.com>
parents: 150 148
diff changeset
653 {
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
654 Token _default = next();
143
d76cc5cad4fc Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents: 140
diff changeset
655 require(Tok.Colon);
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
656 statements.length = 0;
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
657 while (peek.type != Tok.Case
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
658 && peek.type != Tok.Default
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
659 && peek.type != Tok.CloseBrace)
143
d76cc5cad4fc Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents: 140
diff changeset
660 statements ~= parseStatement();
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
661 action.actOnDefaultStmt(res, _default, statements);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
662 continue;
151
Anders Halager <halager@gmail.com>
parents: 150 148
diff changeset
663 }
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
664
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
665 Token _case = peek;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
666 if (_case.type != Tok.Case)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
667 break;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
668 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
669
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
670 Exp[] literals;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
671 do
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
672 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
673 Exp e = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
674 literals ~= e;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
675 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
676 while (skip(Tok.Comma));
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
677 require(Tok.Colon);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
678
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
679 while (peek.type != Tok.Case
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
680 && peek.type != Tok.Default
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
681 && peek.type != Tok.CloseBrace)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
682 statements ~= parseStatement();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
683
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
684 action.actOnCaseStmt(res, _case, literals, statements);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
685
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
686 if (peek.type == Tok.CloseBrace)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
687 break;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
688 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
689 require(Tok.CloseBrace);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
690 return res;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
691 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
692 else if (t.type == Tok.Star)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
693 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
694 auto exp = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
695 require(Tok.Seperator);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
696 return action.actOnExprStmt(exp);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
697 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
698 else
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
699 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
700 messages.report(UnexpectedBeginStmt, t.location).arg(t.getType);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
701 return null;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
702 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
703 }
76
9171f04dd9ee Now parsing varDecls a lot nicer!
Anders Johnsen <skabet@gmail.com>
parents: 75
diff changeset
704
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
705 Decl parseVarDecl()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
706 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
707 // manually hardcoded to only support "type id [= exp];"
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
708 // as that is the only thing the codegen understands
160
6cb2f4201e2a Improved static arrays
Anders Halager <halager@gmail.com>
parents: 158
diff changeset
709 Id type = parseType();
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
710 Id id = Id(next());
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
711 Exp init;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
712 if (skip(Tok.Assign))
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
713 init = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
714 require(Tok.Seperator);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
715 Attribute att;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
716 Decl d = action.actOnDeclarator(type, id, init, att);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
717 return d;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
718 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
719
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
720 /**
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
721 Parses a function/method given the already parsed return type and name
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
722 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
723 Decl parseFunc(ref Id type, ref Id name, Attribute att)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
724 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
725 Decl func = action.actOnStartOfFunctionDef(type, name, att);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
726 parseFuncArgs(func);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
727
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
728 if(peek.type == Tok.Seperator)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
729 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
730 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
731 return func;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
732 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
733 Stmt stmt = parseCompoundStatement();
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
734
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
735 return action.actOnEndOfFunction(func, stmt);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
736 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
737
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
738 /**
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
739 Parse the function arguments, assumes current token is (.
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
740
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
741 Both the intitial paren and the ending paren is consumed.
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
742 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
743 void parseFuncArgs(Decl func)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
744 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
745 require(Tok.OpenParentheses); // Remove the "(" token.
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
746
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
747 while(peek.type != Tok.CloseParentheses)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
748 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
749 auto t = parseType();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
750 Id i;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
751 if(peek.type == Tok.Identifier)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
752 i = parseIdentifier();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
753 action.addFuncArg(func, t, i);
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
754
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
755 if(peek.type == Tok.Comma)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
756 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
757 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
758
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
759 require(Tok.CloseParentheses); // Remove the ")"
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
760 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
761
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
762 /**
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
763 Parse either a block, or a single statement as allowed after if, while
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
764 and for.
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
765 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
766 Stmt parseSingleOrCompoundStatement()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
767 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
768 if (peek.type == Tok.OpenBrace)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
769 return parseCompoundStatement();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
770 return parseStatement();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
771 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
772
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
773 /**
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
774 Parses a function-body or similar, expects an opening brace to be the
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
775 current token.
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
776
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
777 Will consume both the starting { and ending }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
778 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
779 Stmt parseCompoundStatement()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
780 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
781 Token lbrace = require(Tok.OpenBrace);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
782 SmallArray!(Stmt, 32) stmts; // Try to use the stack only
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
783 while ( !isa(Tok.CloseBrace) && !isa(Tok.EOF) )
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
784 stmts ~= parseStatement();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
785 Token rbrace = require(Tok.CloseBrace);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
786 return action.actOnCompoundStmt(lbrace, rbrace, stmts.unsafe());
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
787 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
788
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
789 Id parseIdentifier()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
790 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
791 Token tok = next();
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
792
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
793 if (tok.type is Tok.Identifier)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
794 return Id(tok);
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
795
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
796 messages.report(UnexpectedTokSingle, tok.location)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
797 .arg(tok.getType)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
798 .arg(Tok.Identifier);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
799 }
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
800
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
801 ModuleName parseModuleName()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
802 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
803 auto id = parseIdentifier();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
804 ModuleName mod;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
805 while (skip(Tok.Dot))
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
806 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
807 mod.packages ~= id;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
808 if (peek.type != Tok.Identifier) {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
809 messages.report(ExpectedIdAfterPackage, peek.location);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
810 goto Lerror;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
811 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
812 id = parseIdentifier();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
813 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
814 mod.id = id;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
815 return mod;
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
816 Lerror:
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
817 while (!skip(Tok.Seperator))
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
818 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
819 return mod;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
820 }
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
821
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
822
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
823 /**
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
824 Parse a type - this includes pointer and array(at some point) types.
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
825 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
826 Id parseType()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
827 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
828 Token type = next();
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
829
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
830 Id currentType;
75
86aec2160221 Parsing "int* x"
Anders Johnsen <skabet@gmail.com>
parents: 74
diff changeset
831
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
832 if ( !(type.isBasicType || type.type == Tok.Identifier) )
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
833 messages.report(InvalidType, type.location);
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
834
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
835 currentType = Id(type);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
836 type = peek;
75
86aec2160221 Parsing "int* x"
Anders Johnsen <skabet@gmail.com>
parents: 74
diff changeset
837
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
838 while(type.type == Tok.Star || type.type == Tok.OpenBracket)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
839 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
840 if(type.type == Tok.Star)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
841 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
842 currentType = PointerId(currentType);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
843 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
844 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
845 else
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
846 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
847 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
848 if(peek.type == Tok.Integer)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
849 currentType = StaticArrayId(
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
850 currentType,
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
851 action.actOnNumericConstant(
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
852 require(Tok.Integer)));
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
853 require(Tok.CloseBracket);
75
86aec2160221 Parsing "int* x"
Anders Johnsen <skabet@gmail.com>
parents: 74
diff changeset
854
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
855 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
856 type = peek;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
857 }
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
858
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
859 return currentType;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
860 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
861
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
862 int peekParseType()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
863 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
864 int i;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
865 Token type = peek(i);
84
cc05c041e6a3 Assign stuff to arrays.
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
866
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
867 Id currentType;
84
cc05c041e6a3 Assign stuff to arrays.
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
868
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
869 if ( !(type.isBasicType || type.type == Tok.Identifier) )
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
870 return 0;
84
cc05c041e6a3 Assign stuff to arrays.
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
871
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
872 currentType = Id(type);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
873 type = peek(++i);
84
cc05c041e6a3 Assign stuff to arrays.
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
874
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
875 while(type.type == Tok.Star || type.type == Tok.OpenBracket)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
876 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
877 if(type.type == Tok.Star)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
878 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
879 i++;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
880 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
881 else
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
882 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
883 if(peek(i++).type != Tok.OpenBracket)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
884 return 0;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
885 if(peek(i).type == Tok.Integer)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
886 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
887 i++;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
888 if(peek(i++).type != Tok.CloseBracket)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
889 return 0;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
890 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
891 else
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
892 if(peek(i++).type != Tok.CloseBracket)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
893 return 0;
84
cc05c041e6a3 Assign stuff to arrays.
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
894
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
895 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
896 type = peek(i);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
897 }
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
898
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
899 return i;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
900 }
84
cc05c041e6a3 Assign stuff to arrays.
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
901
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
902 private:
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
903 // -- Expression parsing -- //
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
904 Exp parsePostfixExp(Exp target)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
905 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
906 switch(peek.type)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
907 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
908 case Tok.Dot:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
909 switch(peek(1).type)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
910 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
911 case Tok.Identifier:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
912 Token op = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
913 Id member = Id(next());
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
914 Exp exp = action.actOnMemberReference(target, op.location, member);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
915 return parsePostfixExp(exp);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
916 default:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
917 Token t = peek(1);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
918 messages.report(ExpectedIdAfterDot, t.location);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
919 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
920 case Tok.OpenBracket:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
921 Token open = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
922 Exp index = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
923 Token close = require(Tok.CloseBracket);
158
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
924 return action.actOnIndexExpr(target, open, index, close);
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
925 default:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
926 return target;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
927 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
928 }
28
69464d465284 Now supporting structs - both read and write. Still a few errors though, so watch out.
Anders Johnsen <skabet@gmail.com>
parents: 22
diff changeset
929
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
930 Exp parseExpression(int p = 0)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
931 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
932 auto exp = P();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
933 Token n = peek();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
934 BinOp* op = null;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
935 while ((op = binary(n.type)) != null && op.prec >= p)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
936 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
937 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
938 int q = op.leftAssoc? 1 + op.prec : op.prec;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
939 auto exp2 = parseExpression(q);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
940 exp = action.actOnBinaryOp(n.location, op.operator, exp, exp2);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
941 n = peek();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
942 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
943
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
944 return exp;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
945 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
946
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
947 Exp P()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
948 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
949 Token n = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
950 if (auto op = unary(n.type))
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
951 return action.actOnUnaryOp(n, parseExpression(op.prec));
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
952 else if (n.type == Tok.OpenParentheses)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
953 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
954 auto e = parseExpression(0);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
955 require(Tok.CloseParentheses);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
956 return e;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
957 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
958 else if (n.type == Tok.Identifier)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
959 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
960 Exp value = action.actOnIdentifierExp(Id(n));
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
961 Exp iden = parsePostfixExp(value);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
962 switch(peek.type)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
963 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
964 case Tok.OpenParentheses:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
965 Token lp = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
966 SmallArray!(Exp, 8) args;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
967 while(peek.type != Tok.CloseParentheses)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
968 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
969 if(peek.type == Tok.Comma)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
970 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
971 args ~= parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
972 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
973
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
974 Token rp = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
975 return action.actOnCallExpr(iden, lp, args.unsafe(), rp);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
976
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
977 default:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
978 return iden;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
979 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
980 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
981 else if (n.type == Tok.Cast)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
982 return parseCast(n);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
983 else if (n.type == Tok.Integer)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
984 return action.actOnNumericConstant(n);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
985 else if (n.type == Tok.String)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
986 return action.actOnStringExp(n);
158
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
987 else if (n.type == Tok.New)
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
988 {
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
989 Exp[] allocator_args;
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
990 Exp[] constructor_args;
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
991
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
992 if ( isa(Tok.OpenParentheses))
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
993 {
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
994 next(); // Remove OpenParentheses
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
995
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
996 if ( !isa(Tok.CloseParentheses ) )
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
997 {
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
998 allocator_args ~= parseExpression;
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
999
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1000 while ( isa(Tok.Comma) )
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1001 {
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1002 next(); // Remove Comma
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1003
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1004 allocator_args ~= parseExpression;
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1005 }
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1006 }
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1007 require(Tok.CloseParentheses);
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1008 }
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1009
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1010 auto type = parseType;
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1011
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1012 if ( isa(Tok.OpenParentheses))
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1013 {
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1014 next(); // Remove OpenParentheses
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1015
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1016 if ( !isa(Tok.CloseParentheses ) )
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1017 {
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1018 constructor_args ~= parseExpression;
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1019
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1020 while ( isa(Tok.Comma) )
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1021 {
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1022 next(); // Remove Comma
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1023
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1024 constructor_args ~= parseExpression;
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1025 }
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1026 }
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1027 require(Tok.CloseParentheses);
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1028 }
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1029 return action.actOnNewExpr(type, allocator_args, constructor_args);
57b0b4464a0b Parsing "new", putting it in AST and performs some tests on it. Eg. if the contructor exists and the params matches.
Anders Johnsen <skabet@gmail.com>
parents: 154
diff changeset
1030 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1031
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1032 messages.report(ExpectedExp, n.location)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1033 .fatal(ExitLevel.Parser);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1034 return null;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1035 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1036
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1037 Exp parseCast(ref Token _cast)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1038 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1039 require(Tok.OpenParentheses);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1040 auto n = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1041 if(!n.isBasicType && !n.isIdentifier)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1042 messages.report(ExpectedCastType, n.location);
68
381975d76baf A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents: 62
diff changeset
1043
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1044 require(Tok.CloseParentheses);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1045 auto exp = P();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1046 return action.actOnCastExpr(_cast, Id(n), exp);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1047 }
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
1048
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1049 struct UnOp
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1050 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1051 Tok tokenType;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1052 int prec;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1053 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1054
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1055 static const UnOp[] _unary =
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1056 [
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1057 {Tok.Minus, 4},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1058 {Tok.Star, 4}
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1059 ];
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1060 UnOp* unary(Tok t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1061 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1062 foreach (ref op; _unary)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1063 if (op.tokenType == t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1064 return &op;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1065 return null;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1066 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1067
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1068 struct BinOp
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1069 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1070 Tok tokenType;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1071 int prec;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1072 bool leftAssoc;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1073 Operator operator;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1074 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1075
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1076 static const BinOp[] _binary =
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1077 [
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1078 {Tok.Assign, 1, false, Operator.Assign},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1079 {Tok.PlusAssign, 1, false, Operator.AddAssign},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1080 {Tok.MinusAssign, 1, false, Operator.SubAssign},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1081 {Tok.StarAssign, 1, false, Operator.MulAssign},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1082 {Tok.SlashAssign, 1, false, Operator.DivAssign},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1083 {Tok.PercentAssign, 1, false, Operator.ModAssign},
48
b6c1dc30ca4b Only tests that dont pass now are structs and switches
Anders Halager <halager@gmail.com>
parents: 47
diff changeset
1084
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1085 // =, += etc. 1
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1086 // (need special-case for the ternary operator at this level)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1087 // ||, 2
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1088 // &&, 3
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1089 // |, 4
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1090 // &, 5
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1091 // ^, 6
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1092 // ==, !=, is, !is, 7
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1093 // <, <= etc, 7
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1094 // in, 7
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1095 // <<, >>, >>>, 8
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1096 // +, -, ~, 9
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1097 // *, /, %, 10
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1098 // unary operators here
116
0cd8d6ab3f89 Add in the types for float and co.
Anders Halager <halager@gmail.com>
parents: 104
diff changeset
1099
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1100 {Tok.Eq, 2, true, Operator.Eq},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1101 {Tok.Ne, 2, true, Operator.Ne},
10
2f493057cf17 Some support for the rest of the boolean operators
Anders Halager <halager@gmail.com>
parents: 7
diff changeset
1102
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1103 {Tok.Lt, 2, true, Operator.Lt},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1104 {Tok.Le, 2, true, Operator.Le},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1105 {Tok.Gt, 2, true, Operator.Gt},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1106 {Tok.Ge, 2, true, Operator.Ge},
10
2f493057cf17 Some support for the rest of the boolean operators
Anders Halager <halager@gmail.com>
parents: 7
diff changeset
1107
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1108 {Tok.Plus, 3, true, Operator.Add},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1109 {Tok.Minus, 3, true, Operator.Sub},
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
1110
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1111 {Tok.Star, 5, true, Operator.Mul},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1112 {Tok.Slash, 5, true, Operator.Div},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1113 {Tok.Percent, 5, true, Operator.Mod},
123
6a5f745d351c Parsing <<, >> and >>>.
Anders Johnsen <skabet@gmail.com>
parents: 116
diff changeset
1114
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1115 {Tok.LeftShift, 8, true, Operator.LeftShift},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1116 {Tok.RightShift, 8, true, Operator.RightShift},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1117 {Tok.UnsignedRightShift, 8, true, Operator.UnsignedRightShift}
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1118 ];
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1119 BinOp* binary(Tok t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1120 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1121 foreach (ref op; _binary)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1122 if (op.tokenType == t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1123 return &op;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1124 return null;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1125 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1126
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1127 private:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1128
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1129 Token require(Tok t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1130 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1131 if (peek().type != t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1132 messages.report(UnexpectedTokSingle, peek.location)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1133 .arg(peek.getType)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1134 .arg(t);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1135 return next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1136 }
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 33
diff changeset
1137
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1138 bool skip(Tok t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1139 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1140 if (peek().type != t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1141 return false;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1142 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1143 return true;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1144 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1145
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1146 bool isa(Tok t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1147 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1148 return peek.type == t;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1149 }
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
1150
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1151 Token next()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1152 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1153 return lexer.next;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1154 }
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
1155
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1156 Token peek(int i = 0)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1157 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1158 return lexer.peek(i);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1159 }
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
1160
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1161 Lexer lexer;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1162 SourceManager sm;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1163 }
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
1164