annotate parser/Parser.d @ 185:7b274cfdc1dc

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