annotate parser/Parser.d @ 194:08f68d684047

Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with". Also added support for alias.
author Anders Johnsen <skabet@gmail.com>
date Tue, 29 Jul 2008 13:54:44 +0200
parents 85e492318bb6
children
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;
190
85e492318bb6 Can parse empty file again.
Anders Johnsen <skabet@gmail.com>
parents: 189
diff changeset
38 if (peek.type == 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 {
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
77 switch(peek.type)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
78 {
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
79 case Tok.Struct:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
80 Id type = Id(next());
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
81 Id iden = Id(require(Tok.Identifier));
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
82 return parseStruct(type, iden, att);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
83
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
84 case Tok.Class:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
85 Id type = Id(next());
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
86 Id iden = Id(require(Tok.Identifier));
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
87 return parseClass(type, iden, att);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
88
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
89 case Tok.Interface:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
90 Id type = Id(next());
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
91 Id iden = Id(require(Tok.Identifier));
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
92 return parseInterface(type, iden, att);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
93
194
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 190
diff changeset
94 case Tok.Alias:
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 190
diff changeset
95 next();
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 190
diff changeset
96 auto decl = parseDecl(Attribute());
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 190
diff changeset
97 return action.actOnAliasDecl(decl, att);
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 190
diff changeset
98
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
99 case Tok.Identifier:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
100 Id type = parseType;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
101 Id iden = Id(require(Tok.Identifier));
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
102
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
103 switch(peek.type)
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
104 {
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
105 case Tok.Seperator:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
106 Token sep = next();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
107 return action.actOnDeclarator(type, iden, null, att);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
108
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
109 case Tok.Assign:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
110 Token assign = next();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
111 Exp exp = parseExpression();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
112 require(Tok.Seperator);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
113 return action.actOnDeclarator(type, iden, exp, att);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
114
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
115 case Tok.OpenParentheses:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
116 return parseFunc(type, iden, att);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
117
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
118 default:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
119 auto n1 = next();
189
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
120 isEOF(type.tok);
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
121 messages.report(UnexpectedTok, n1.location).arg(n1.get(sm));
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
122 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
123 }
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
124 messages.report(InvalidDeclType, peek.location)
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
125 .arg(sm.getText(peek.asRange));
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
126
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
127 default:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
128 if (peek.isBasicType)
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
129 goto case Tok.Identifier;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
130
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
131 messages.report(UnexpectedTok, peek.location)
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
132 .arg(sm.getText(peek.asRange));
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
133
194
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 190
diff changeset
134 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
135 return null;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
136 }
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
137 messages.report(UnexpectedTok, peek.location)
189
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
138 .arg(peek.get(sm))
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
139 .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
140 .fatal(ExitLevel.Parser);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
141 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
142
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
143 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
144 {
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
145 Extern e = Extern.D;
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
146 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
147 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
148
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
149 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
150
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 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
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 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
154 {
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 case "C":
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
156 if (peek(0).type == Tok.Plus &&
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
157 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
158 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
159 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
160 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
161 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
162 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
163 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
164 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
165 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
166 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
167 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
168 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
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 "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
171 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
172 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
173 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
174 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
175 }
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
183
8ea749b7da91 Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents: 176
diff changeset
177 if (!isa(Tok.CloseParentheses))
8ea749b7da91 Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents: 176
diff changeset
178 messages.report(UnexpectedTokSingle, peek.location);
8ea749b7da91 Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents: 176
diff changeset
179
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
180 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
181 }
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
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
183 /**
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
184 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
185 */
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
186 Decl[] parseImports()
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
187 {
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
188 Token _import = require(Tok.Import);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
189 SmallArray!(Decl) res;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
190 void addToRes(Decl d) { res ~= d; }
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
191
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
192 bool done = false;
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
193 while (!done && !isa(Tok.Seperator))
99
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 ModuleName mod = parseModuleName();
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
196 Token tok = peek;
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
197 switch (tok.type)
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 case Tok.Comma:
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
200 // import A, B.C;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
201 // parse another module-name
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
202 next();
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
203 res ~= action.actOnImport(_import, mod, null);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
204 break;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
205 case Tok.Assign:
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
206 // import B = A.A;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
207 // ^- must be a single identifier
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
208 // renamed import
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
209 if (mod.packages.length != 0)
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
210 {
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
211 SLoc loc = mod.packages[0].tok.location;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
212 messages.report(RenameMustBeSingleIdent, loc);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
213 }
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
214 //if (isStatic)
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
215 // error("Static imports cannot be renamed");
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
216 next();
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
217 Id name = mod.id;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
218 mod = parseModuleName();
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
219 // create from mod and rename to `name`
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
220 res ~= action.actOnImport(_import, mod, &name);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
221 break;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
222 case Tok.Colon:
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
223 // import A : a;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
224 // selective imports, potentially import A : print = a
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
225 next();
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
226 Decl d = action.actOnImport(_import, mod, null);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
227 // do-while on a comma:
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
228 // add explicit symbol
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
229 do
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
230 {
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
231 Id sym = parseIdentifier();
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
232 Id dummy;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
233 Id* name = null;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
234 if (skip(Tok.Assign))
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
235 {
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
236 dummy = sym;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
237 name = &dummy;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
238 sym = parseIdentifier();
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
239 }
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
240 action.addSelectiveImport(d, sym, name);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
241
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
242 } while (skip(Tok.Comma));
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
243 require(Tok.Seperator);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
244 res ~= d;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
245 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
246 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
247 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
248 break;
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
249 default:
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
250 goto Lerror;
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
251 }
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
252 res ~= action.actOnImport(_import, mod, null);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
253 }
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
254
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
255 require(Tok.Seperator);
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
256 return res.safe();
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
257 Lerror:
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
258 while (!isa (Tok.Seperator))
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
259 next();
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
260 return res.safe();
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
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
263 /**
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
264 Parse interface
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
265 */
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
266 Decl parseInterface(Id type, Id iden, Attribute att)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
267 {
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
268 auto decl = action.actOnDeclarator(type, iden, null, att);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
269
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
270 if (peek.type == Tok.Colon)
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
271 // SuperInterfaces
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
272 {
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
273 next(); // Remove colon.
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
274
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
275 Id identifier;
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
276
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
277 // The identifier
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
278 identifier = Id(require(Tok.Identifier));
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
279
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
280 action.actOnInterfaceBaseClass(decl, identifier);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
281
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
282 // 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
283 while (peek.type == Tok.Comma)
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
284 {
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
285 next(); // Remove comma
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
286
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
287 // The identifier
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
288 identifier = Id(require(Tok.Identifier));
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
289
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
290 action.actOnInterfaceBaseClass(decl, identifier);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
291 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
292 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
293
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
294 require(Tok.OpenBrace);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
295
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
296 auto nes = parseAttributeInit;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
297 while( !isa(Tok.EOF) && !isa(Tok.CloseBrace) )
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
298 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
299 while ( peek.isAttribute )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
300 nes ~= parseAttribute(nes[$-1]);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
301
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
302 auto m_decl = parseDecl(nes[$-1].a);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
303 action.actOnInterfaceMember(decl, m_decl);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
304
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
305 nes = parseAttributeScope(nes);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
306 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
307
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
308 require(Tok.CloseBrace);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
309
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
310 return decl;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
311 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
312
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
313 /**
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
314 Parse class
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
315 */
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
316 Decl parseClass(Id type, Id iden, Attribute att)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
317 {
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
318 auto decl = action.actOnDeclarator(type, iden, null, att);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
319
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
320 if (peek.type == Tok.Colon)
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
321 // BaseClassList - Super class and interfaces(in that order)
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
322 {
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
323 next(); // Remove colon.
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
324
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
325 Token protection;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
326 Id identifier;
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
327
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
328 // First we expect an optional protection level.
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
329 if (peek.isBaseClassProtection)
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
330 protection = next();
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
331 // Then the identifier
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
332 identifier = Id(require(Tok.Identifier));
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
333
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
334 action.actOnClassBaseClass(decl, identifier);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
335
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
336 // 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
337 while (peek.type == Tok.Comma)
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
338 {
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
339 next(); // Remove comma
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
340
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
341 // First we expect an optional protection level.
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
342 if (peek.isBaseClassProtection)
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
343 protection = next();
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
344 // Then the identifier
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
345 identifier = Id(require(Tok.Identifier));
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
346
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
347 action.actOnClassBaseClass(decl, identifier);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
348 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
349 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
350
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
351 require(Tok.OpenBrace);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
352
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
353 auto nes = parseAttributeInit;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
354 while( !isa(Tok.EOF) && !isa(Tok.CloseBrace) )
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
355 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
356 while ( peek.isAttribute )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
357 nes ~= parseAttribute(nes[$-1]);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
358
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
359 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
360 {
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
361 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
362 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
363 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
364 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
365 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
366
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 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
368 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
369 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
370 }
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
371
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
372 nes = parseAttributeScope(nes);
136
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
373 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
374
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
375 require(Tok.CloseBrace);
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
376
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
377 return decl;
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
378 }
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
379
2be29b296081 Lots of changes:
johnsen@johnsen-laptop
parents: 126
diff changeset
380 /**
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
381 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
382 */
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
383 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
384 {
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
385 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
386
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
387 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
388
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
389 auto nes = parseAttributeInit;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
390 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
391 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
392 while ( peek.isAttribute )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
393 nes ~= parseAttribute(nes[$-1]);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
394
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
395 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
396 action.actOnStructMember(decl, m_decl);
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
397
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
398 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
399 }
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
400
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
401 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
402
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
403 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
404 }
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
405
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
406 Att[] parseAttributeInit()
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
407 {
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
408 Att[] nes;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
409 nes ~= Att();
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
410 nes[0].nested = Scope;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
411 return nes;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
412 }
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
413
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
414 Att[] parseAttributeScope(Att[] nes)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
415 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
416 while ( nes[$-1].nested == Single )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
417 nes.length = nes.length - 1;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
418
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
419 while ( isa(Tok.CloseBrace) && nes.length > 1)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
420 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
421 while ( nes.length > 1 )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
422 {
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
423 if( nes[$-1].nested == Scope )
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
424 {
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
425 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
426 next();
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
427 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
428 }
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
429 nes.length = nes.length - 1;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
430 }
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
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
433 return nes;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
434 }
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 Att parseAttribute(Att last)
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 Att _parseAttribute(Att last)
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 Att a = last;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
441 a.nested = Single;
5
2c5a8f4c254a Added very simple if support.
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
442
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
443 switch(peek.type)
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 case Tok.Public:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
446 a.a.setProtection(Protection.Public);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
447 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
448 case Tok.Private:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
449 a.a.setProtection(Protection.Private);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
450 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
451 case Tok.Package:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
452 a.a.setProtection(Protection.Package);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
453 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
454 case Tok.Protected:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
455 a.a.setProtection(Protection.Protected);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
456 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
457 case Tok.Export:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
458 a.a.setProtection(Protection.Export);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
459 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
460 case Tok.Static:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
461 a.a.setStatic;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
462 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
463 case Tok.Final:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
464 a.a.setFinal;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
465 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
466 case Tok.Const:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
467 a.a.setConst;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
468 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
469 case Tok.Abstract:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
470 a.a.setAbstract;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
471 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
472 case Tok.Override:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
473 a.a.setOverride;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
474 break;
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
475 case Tok.Deprecated:
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
476 a.a.setDeprecated;
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
477 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
478 case Tok.Auto:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
479 a.a.setAuto;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
480 break;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
481 case Tok.Extern:
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
482 Extern e = parseLinkageType;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
483 a.a.setExtern(e);
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 }
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
486 next();
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
487
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
488 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
489 }
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
490
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
491 Att a = _parseAttribute(last);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
492
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
493 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
494 {
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
495 a = parseAttribute(a);
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
496 }
45
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
497
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
498 if (peek.type == Tok.Colon)
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 a.nested = All;
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
501 next();
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
502 }
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
503 else if (peek.type == Tok.OpenBrace)
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
504 {
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
505 a.nested = Scope;
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
506 next();
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
507 }
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
508
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
509 return a;
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
510 }
45
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
511
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
512 enum : uint
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
513 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
514 Single,
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
515 Scope,
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
516 All
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
517 }
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
518
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
519 struct Att
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 Attribute a;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
522 uint nested;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
523 }
45
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
524
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
525 /**
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
526 Parse statements.
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 This is the place to attack!
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
529 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
530 Stmt parseStatement()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
531 {
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
532 switch (peek.type)
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
533 {
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
534 case Tok.Return:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
535 Token ret = next();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
536 Exp exp;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
537 if (peek.type != Tok.Seperator)
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
538 exp = parseExpression();
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
539 require(Tok.Seperator);
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
540 return action.actOnReturnStmt(ret, exp);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
541
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
542 case Tok.If:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
543 Token _if = next();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
544
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
545 require(Tok.OpenParentheses);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
546 Exp cond = parseExpression();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
547 require(Tok.CloseParentheses);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
548
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
549 Stmt thenB = parseSingleOrCompoundStatement();
146
8c09fdaa724e Parsing for-loop.
Anders Johnsen <skabet@gmail.com>
parents: 144
diff changeset
550
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
551 // if there is no else part we use the if as token, to have
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
552 // something than can be passed along
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
553 Token _else = _if;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
554 Stmt elseB;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
555 if (peek.type == Tok.Else)
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
556 {
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
557 _else = next();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
558 elseB = parseSingleOrCompoundStatement();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
559 }
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
560 return action.actOnIfStmt(_if, cond, thenB, _else, elseB);
84
cc05c041e6a3 Assign stuff to arrays.
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
561
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
562 case Tok.While:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
563 Token _while = next();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
564 require(Tok.OpenParentheses);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
565 Exp cond = parseExpression();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
566 require(Tok.CloseParentheses);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
567 Stmt bodyStmt = parseSingleOrCompoundStatement();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
568 return action.actOnWhileStmt(_while, cond, bodyStmt);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
569
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
570 case Tok.For:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
571 Token _for = next();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
572 require(Tok.OpenParentheses);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
573 Stmt init;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
574 if ( isa(Tok.Seperator))
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
575 require(Tok.Seperator);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
576 else
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
577 init = parseStatement();
126
c3b24e7e8cf8 Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents: 123
diff changeset
578
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
579 Exp cond;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
580 if ( !isa(Tok.Seperator))
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
581 cond = parseExpression();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
582 require(Tok.Seperator);
76
9171f04dd9ee Now parsing varDecls a lot nicer!
Anders Johnsen <skabet@gmail.com>
parents: 75
diff changeset
583
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
584 Exp incre;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
585 if ( !isa(Tok.CloseParentheses))
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
586 incre = parseExpression();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
587 require(Tok.CloseParentheses);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
588
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
589 Stmt bodyStmt = parseSingleOrCompoundStatement();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
590 return action.actOnForStmt(_for, init, cond, incre, bodyStmt);
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
591
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
592 case Tok.Switch:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
593 auto t = next();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
594 require(Tok.OpenParentheses);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
595 auto target = parseExpression();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
596 auto res = action.actOnStartOfSwitchStmt(t, target);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
597 require(Tok.CloseParentheses);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
598 require(Tok.OpenBrace);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
599 while (true)
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
600 {
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
601 Stmt[] statements;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
602 if (isa(Tok.Default))
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
603 {
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
604 Token _default = next();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
605 require(Tok.Colon);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
606 statements.length = 0;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
607 while (peek.type != Tok.Case
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
608 && peek.type != Tok.Default
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
609 && peek.type != Tok.CloseBrace)
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
610 statements ~= parseStatement();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
611 action.actOnDefaultStmt(res, _default, statements);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
612 continue;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
613 }
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
614
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
615 Token _case = peek;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
616 if (_case.type != Tok.Case)
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
617 break;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
618 next();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
619
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
620 Exp[] literals;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
621 do
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
622 {
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
623 Exp e = parseExpression();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
624 literals ~= e;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
625 }
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
626 while (skip(Tok.Comma));
143
d76cc5cad4fc Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents: 140
diff changeset
627 require(Tok.Colon);
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
628
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
629 while (peek.type != Tok.Case
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
630 && peek.type != Tok.Default
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
631 && peek.type != Tok.CloseBrace)
143
d76cc5cad4fc Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents: 140
diff changeset
632 statements ~= parseStatement();
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
633
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
634 action.actOnCaseStmt(res, _case, literals, statements);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
635
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
636 if (peek.type == Tok.CloseBrace)
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
637 break;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
638 }
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
639 require(Tok.CloseBrace);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
640 return res;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
641
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
642 case Tok.Star:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
643 auto exp = parseExpression();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
644 require(Tok.Seperator);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
645 return action.actOnExprStmt(exp);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
646
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
647 case Tok.Identifier:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
648 // If it's a '*' it must be a method. Otherwise it won't give
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
649 // any sense.
176
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 172
diff changeset
650
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
651 if (isa(Tok.Function, 1) ||
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
652 isa(Tok.Identifier, 1) ||
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
653 isa(Tok.Star, 1))
176
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 172
diff changeset
654 {
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 172
diff changeset
655 Attribute a;
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 172
diff changeset
656 return action.actOnDeclStmt(parseDecl(a));
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 172
diff changeset
657 }
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
658
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
659 if (isa(Tok.OpenBracket, 1))
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
660 {
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
661 int i = 1;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
662 while (isa(Tok.OpenBracket, i) ||
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
663 isa(Tok.Star, i) ||
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
664 isa(Tok.Identifier, i))
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
665 {
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
666 if (isa(Tok.Identifier, i))
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
667 return action.actOnDeclStmt(parseDecl(Attribute()));
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
668
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
669 i++;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
670 if (isa(Tok.Star,i-1))
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
671 continue;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
672 // Must be OpenBracket here..
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
673
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
674 if (isa(Tok.Integer, i))
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
675 i++;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
676 else
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
677 if (isa(Tok.CloseBracket, i))
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
678 return action.actOnDeclStmt(parseDecl(Attribute()));
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
679 else
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
680 i++;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
681
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
682 if (!isa(Tok.CloseBracket, i))
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
683 break;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
684 i++;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
685 }
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
686 if (isa(Tok.Function, i))
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
687 return action.actOnDeclStmt(parseDecl(Attribute()));
151
Anders Halager <halager@gmail.com>
parents: 150 148
diff changeset
688 }
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
689
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
690 // Expression: a.b, a = b, a(b) etc.
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
691 Exp exp = parseExpression();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
692 require(Tok.Seperator);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
693 return action.actOnExprStmt(exp);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
694
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
695 case Tok.Void: // And all basic types
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
696 return action.actOnDeclStmt(parseVarDecl());
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
697
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
698 default:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
699 if (peek.isBasicType)
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
700 goto case Tok.Void;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
701
189
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
702 messages.report(UnexpectedBeginStmt, peek.location).arg(peek.get(sm));
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
703 require(Tok.Seperator);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
704 return null;
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
705 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
706 }
76
9171f04dd9ee Now parsing varDecls a lot nicer!
Anders Johnsen <skabet@gmail.com>
parents: 75
diff changeset
707
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
708 Decl parseVarDecl()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
709 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
710 // manually hardcoded to only support "type id [= exp];"
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
711 // as that is the only thing the codegen understands
160
6cb2f4201e2a Improved static arrays
Anders Halager <halager@gmail.com>
parents: 158
diff changeset
712 Id type = parseType();
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
713 Id id = Id(next());
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
714 Exp init;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
715 if (skip(Tok.Assign))
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
716 init = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
717 require(Tok.Seperator);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
718 Attribute att;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
719 Decl d = action.actOnDeclarator(type, id, init, att);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
720 return d;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
721 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
722
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
723 /**
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
724 Parses a function/method given the already parsed return type and name
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
725 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
726 Decl parseFunc(ref Id type, ref Id name, Attribute att)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
727 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
728 Decl func = action.actOnStartOfFunctionDef(type, name, att);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
729 parseFuncArgs(func);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
730
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
731 if(peek.type == Tok.Seperator)
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 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
734 return func;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
735 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
736 Stmt stmt = parseCompoundStatement();
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
737
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
738 return action.actOnEndOfFunction(func, stmt);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
739 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
740
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
741 /**
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
742 Parse the function arguments, assumes current token is (.
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
743
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
744 Both the intitial paren and the ending paren is consumed.
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
745 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
746 void parseFuncArgs(Decl func)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
747 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
748 require(Tok.OpenParentheses); // Remove the "(" token.
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
749
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
750 while(peek.type != Tok.CloseParentheses)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
751 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
752 auto t = parseType();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
753 Id i;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
754 if(peek.type == Tok.Identifier)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
755 i = parseIdentifier();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
756 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
757
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
758 if(peek.type == Tok.Comma)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
759 next();
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 require(Tok.CloseParentheses); // Remove the ")"
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
763 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
764
152
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 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
767 and for.
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
768 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
769 Stmt parseSingleOrCompoundStatement()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
770 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
771 if (peek.type == Tok.OpenBrace)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
772 return parseCompoundStatement();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
773 return parseStatement();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
774 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
775
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
776 /**
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
777 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
778 current token.
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
779
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
780 Will consume both the starting { and ending }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
781 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
782 Stmt parseCompoundStatement()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
783 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
784 Token lbrace = require(Tok.OpenBrace);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
785 SmallArray!(Stmt, 32) stmts; // Try to use the stack only
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
786 while ( !isa(Tok.CloseBrace) && !isa(Tok.EOF) )
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
787 stmts ~= parseStatement();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
788 Token rbrace = require(Tok.CloseBrace);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
789 return action.actOnCompoundStmt(lbrace, rbrace, stmts.unsafe());
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
790 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
791
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
792 Id parseIdentifier()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
793 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
794 Token tok = next();
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 if (tok.type is Tok.Identifier)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
797 return Id(tok);
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
798
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
799 messages.report(UnexpectedTokSingle, tok.location)
189
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
800 .arg(tok.get(sm))
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
801 .arg(Tok.Identifier);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
802 }
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
803
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
804 ModuleName parseModuleName()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
805 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
806 auto id = parseIdentifier();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
807 ModuleName mod;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
808 while (skip(Tok.Dot))
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
809 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
810 mod.packages ~= id;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
811 if (peek.type != Tok.Identifier) {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
812 messages.report(ExpectedIdAfterPackage, peek.location);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
813 goto Lerror;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
814 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
815 id = parseIdentifier();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
816 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
817 mod.id = id;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
818 return mod;
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
819 Lerror:
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
820 while (!skip(Tok.Seperator))
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
821 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
822 return mod;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
823 }
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
824
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
825
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
826 /**
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
827 Parse a type - this includes pointer and array(at some point) types.
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
828 */
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
829 Id parseType()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
830 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
831 Token type = next();
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
832
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
833 Id currentType;
75
86aec2160221 Parsing "int* x"
Anders Johnsen <skabet@gmail.com>
parents: 74
diff changeset
834
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
835 if ( !(type.isBasicType || type.type == Tok.Identifier) )
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
836 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
837
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
838 currentType = Id(type);
75
86aec2160221 Parsing "int* x"
Anders Johnsen <skabet@gmail.com>
parents: 74
diff changeset
839
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
840 while(true)
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
841 {
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
842 switch(peek.type)
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
843 {
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
844 case Tok.Star:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
845 currentType = PointerTypeId(currentType);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
846 next();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
847 break;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
848 case Tok.OpenBracket:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
849 next();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
850 if (isa(Tok.Integer))
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
851 currentType = StaticArrayTypeId(
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
852 currentType,
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
853 action.actOnNumericConstant(
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
854 require(Tok.Integer)));
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
855 require(Tok.CloseBracket);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
856 break;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
857 case Tok.Function:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
858 next();
75
86aec2160221 Parsing "int* x"
Anders Johnsen <skabet@gmail.com>
parents: 74
diff changeset
859
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
860
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
861 require(Tok.OpenParentheses); // Remove the "(" token.
84
cc05c041e6a3 Assign stuff to arrays.
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
862
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
863 DeclT[] decls;
84
cc05c041e6a3 Assign stuff to arrays.
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
864
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
865 while(peek.type != Tok.CloseParentheses)
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
866 {
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
867 auto t = parseType();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
868 Id i;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
869 if(peek.type == Tok.Identifier)
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
870 i = parseIdentifier();
84
cc05c041e6a3 Assign stuff to arrays.
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
871
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
872 // Act on function type param
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
873 decls ~= action.actOnDeclarator(t, i, null, Attribute());
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
874
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
875 if(peek.type == Tok.Comma)
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
876 next();
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
877 }
84
cc05c041e6a3 Assign stuff to arrays.
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
878
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
879 currentType = FunctionTypeId(currentType, decls);
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
880
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
881 require(Tok.CloseParentheses); // Remove the ")"
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
882 break;
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
883 default:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
884 goto end;
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
885 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
886 }
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
887 end:
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
888 return currentType;
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
889 }
84
cc05c041e6a3 Assign stuff to arrays.
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
890
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 37
diff changeset
891 private:
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
892 // -- Expression parsing -- //
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
893 Exp parsePostfixExp(Exp target)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
894 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
895 switch(peek.type)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
896 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
897 case Tok.Dot:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
898 switch(peek(1).type)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
899 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
900 case Tok.Identifier:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
901 Token op = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
902 Id member = Id(next());
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
903 Exp exp = action.actOnMemberReference(target, op.location, member);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
904 return parsePostfixExp(exp);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
905 default:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
906 Token t = peek(1);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
907 messages.report(ExpectedIdAfterDot, t.location);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
908 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
909 case Tok.OpenBracket:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
910 Token open = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
911 Exp index = parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
912 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
913 return action.actOnIndexExpr(target, open, index, close);
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
914 default:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
915 return target;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
916 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
917 }
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
918
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
919 Exp parseExpression(int p = 0)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
920 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
921 auto exp = P();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
922 Token n = peek();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
923 BinOp* op = null;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
924 while ((op = binary(n.type)) != null && op.prec >= p)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
925 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
926 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
927 int q = op.leftAssoc? 1 + op.prec : op.prec;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
928 auto exp2 = parseExpression(q);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
929 exp = action.actOnBinaryOp(n.location, op.operator, exp, exp2);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
930 n = peek();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
931 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
932
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
933 return exp;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
934 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
935
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
936 Exp P()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
937 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
938 Token n = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
939 if (auto op = unary(n.type))
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
940 return action.actOnUnaryOp(n, parseExpression(op.prec));
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
941 else if (n.type == Tok.OpenParentheses)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
942 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
943 auto e = parseExpression(0);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
944 require(Tok.CloseParentheses);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
945 return e;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
946 }
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
947 else if (n.type == Tok.Identifier)
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 Exp value = action.actOnIdentifierExp(Id(n));
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
950 Exp iden = parsePostfixExp(value);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
951 switch(peek.type)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
952 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
953 case Tok.OpenParentheses:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
954 Token lp = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
955 SmallArray!(Exp, 8) args;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
956 while(peek.type != Tok.CloseParentheses)
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 if(peek.type == Tok.Comma)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
959 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
960 args ~= parseExpression();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
961 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
962
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
963 Token rp = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
964 return action.actOnCallExpr(iden, lp, args.unsafe(), rp);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
965
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
966 default:
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
967 return iden;
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 }
194
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 190
diff changeset
970 else if (n.type == Tok.Null)
08f68d684047 Rename some files. Hopefully we can get a more iterative sema pass, that's a lot easier to "get startet with".
Anders Johnsen <skabet@gmail.com>
parents: 190
diff changeset
971 return action.actOnNullExpr(n.location);
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
972 else if (n.type == Tok.Cast)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
973 return parseCast(n);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
974 else if (n.type == Tok.Integer)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
975 return action.actOnNumericConstant(n);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
976 else if (n.type == Tok.String)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
977 return action.actOnStringExp(n);
185
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
978 else if (n.type == Tok.OpenBracket)
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
979 {
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
980 // Array literals
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
981 Exp[] exps;
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
982 exps ~= parseExpression();
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
983
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
984 while (isa(Tok.Comma))
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
985 {
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
986 next();
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
987
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
988 if (isa(Tok.CloseBracket))
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
989 break;
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
990 exps ~= parseExpression();
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
991 }
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
992 scope e = require(Tok.CloseBracket);
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
993 return action.actOnArrayLiteralExpr(exps, n.location, e.location);
7b274cfdc1dc Added support for array literals. Codegen is broken, though.
Anders Johnsen <skabet@gmail.com>
parents: 183
diff changeset
994 }
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
995 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
996 {
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 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
998 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
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 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
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 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
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 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
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 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
1007
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 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
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 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
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 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
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 }
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 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
1016 }
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 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
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 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
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 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
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 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
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 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
1027
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 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
1029 {
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 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
1031
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
1032 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
1033 }
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
1034 }
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
1035 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
1036 }
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
1037 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
1038 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1039
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1040 messages.report(ExpectedExp, n.location)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1041 .fatal(ExitLevel.Parser);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1042 return null;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1043 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1044
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1045 Exp parseCast(ref Token _cast)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1046 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1047 require(Tok.OpenParentheses);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1048 auto n = next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1049 if(!n.isBasicType && !n.isIdentifier)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1050 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
1051
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1052 require(Tok.CloseParentheses);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1053 auto exp = P();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1054 return action.actOnCastExpr(_cast, Id(n), exp);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1055 }
148
6ec686d9c87d Fixed some for parsing, and removed a little ugly bug.
Anders Johnsen <skabet@gmail.com>
parents: 146
diff changeset
1056
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1057 struct UnOp
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1058 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1059 Tok tokenType;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1060 int prec;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1061 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1062
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1063 static const UnOp[] _unary =
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1064 [
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1065 {Tok.Minus, 4},
176
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 172
diff changeset
1066 {Tok.Star, 4},
dc9bf56b7ace Can now use & as a unary operator and take an AddressOf
Anders Johnsen <skabet@gmail.com>
parents: 172
diff changeset
1067 {Tok.And, 4}
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1068 ];
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1069 UnOp* unary(Tok t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1070 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1071 foreach (ref op; _unary)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1072 if (op.tokenType == t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1073 return &op;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1074 return null;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1075 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1076
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1077 struct BinOp
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1078 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1079 Tok tokenType;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1080 int prec;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1081 bool leftAssoc;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1082 Operator operator;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1083 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1084
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1085 static const BinOp[] _binary =
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1086 [
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1087 {Tok.Assign, 1, false, Operator.Assign},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1088 {Tok.PlusAssign, 1, false, Operator.AddAssign},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1089 {Tok.MinusAssign, 1, false, Operator.SubAssign},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1090 {Tok.StarAssign, 1, false, Operator.MulAssign},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1091 {Tok.SlashAssign, 1, false, Operator.DivAssign},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1092 {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
1093
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1094 // =, += etc. 1
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1095 // (need special-case for the ternary operator at this level)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1096 // ||, 2
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1097 // &&, 3
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1098 // |, 4
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1099 // &, 5
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1100 // ^, 6
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1101 // ==, !=, is, !is, 7
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1102 // <, <= etc, 7
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1103 // in, 7
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1104 // <<, >>, >>>, 8
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1105 // +, -, ~, 9
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1106 // *, /, %, 10
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1107 // unary operators here
116
0cd8d6ab3f89 Add in the types for float and co.
Anders Halager <halager@gmail.com>
parents: 104
diff changeset
1108
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1109 {Tok.Eq, 2, true, Operator.Eq},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1110 {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
1111
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1112 {Tok.Lt, 2, true, Operator.Lt},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1113 {Tok.Le, 2, true, Operator.Le},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1114 {Tok.Gt, 2, true, Operator.Gt},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1115 {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
1116
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1117 {Tok.Plus, 3, true, Operator.Add},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1118 {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
1119
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1120 {Tok.Star, 5, true, Operator.Mul},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1121 {Tok.Slash, 5, true, Operator.Div},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1122 {Tok.Percent, 5, true, Operator.Mod},
123
6a5f745d351c Parsing <<, >> and >>>.
Anders Johnsen <skabet@gmail.com>
parents: 116
diff changeset
1123
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1124 {Tok.LeftShift, 8, true, Operator.LeftShift},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1125 {Tok.RightShift, 8, true, Operator.RightShift},
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1126 {Tok.UnsignedRightShift, 8, true, Operator.UnsignedRightShift}
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1127 ];
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1128 BinOp* binary(Tok t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1129 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1130 foreach (ref op; _binary)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1131 if (op.tokenType == t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1132 return &op;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1133 return null;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1134 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1135
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1136 private:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1137
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1138 Token require(Tok t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1139 {
189
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1140 if (!isa(t))
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1141 if(isa(Tok.EOF))
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1142 messages.report(UnexpectedEOF,
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1143 [lexer.last.asRange][], [])
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1144 .arg(lexer.last.get(sm))
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1145 .fatal(ExitLevel.Parser);
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1146 else
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1147 messages.report(UnexpectedTokSingle, peek.location)
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1148 .arg(peek.get(sm))
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1149 .arg(typeToString[t]);
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1150 return next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1151 }
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 33
diff changeset
1152
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1153 bool skip(Tok t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1154 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1155 if (peek().type != t)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1156 return false;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1157 next();
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1158 return true;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1159 }
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1160
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
1161 bool isa(Tok t, int i = 0)
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1162 {
172
01c2c49775ef - Changed Parser to be more clean on type parsing.
Anders Johnsen <skabet@gmail.com>
parents: 160
diff changeset
1163 return peek(i).type == t;
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1164 }
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
1165
189
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1166 bool isEOF(Token t)
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1167 {
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1168 if (isa(Tok.EOF))
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1169 messages.report(UnexpectedEOF,
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1170 [t.asRange][], [])
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1171 .arg(t.get(sm))
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1172 .fatal(ExitLevel.Parser);
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1173 return false;
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1174 }
75d0544ddc45 Better error handling on unexpected EOF.
Anders Johnsen <skabet@gmail.com>
parents: 185
diff changeset
1175
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1176 Token next()
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1177 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1178 return lexer.next;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1179 }
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
1180
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1181 Token peek(int i = 0)
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1182 {
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1183 return lexer.peek(i);
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1184 }
144
6e6355fb5f0f - Parsing nested attributes.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
1185
152
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1186 Lexer lexer;
893f23a9de93 Formatting change
Anders Halager <halager@gmail.com>
parents: 151
diff changeset
1187 SourceManager sm;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1188 }
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
1189