annotate trunk/src/Parser.d @ 72:f75e359f939f

- Added parseExpression() method. - Added while loop to parseAssignExpression(). - Implemented parseCondExpression().
author aziz
date Sun, 01 Jul 2007 17:21:02 +0000
parents b3777cca323c
children 11572f4a138c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
8ba2570de175 Initial import.
aziz
parents:
diff changeset
1 /++
8ba2570de175 Initial import.
aziz
parents:
diff changeset
2 Author: Aziz Köksal
8ba2570de175 Initial import.
aziz
parents:
diff changeset
3 License: GPL2
8ba2570de175 Initial import.
aziz
parents:
diff changeset
4 +/
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
5 module Parser;
69
24db7c5522d5 - Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents: 68
diff changeset
6 import Lexer;
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
7 import Token;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
8 import Messages;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
9 import Information;
70
0d3ef6daec04 - Added Expression class stubs.
aziz
parents: 69
diff changeset
10 import Expressions;
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
11
68
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
12 enum STC
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
13 {
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
14 Abstract,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
15 Auto,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
16 Const,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
17 Deprecated,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
18 Extern,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
19 Final,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
20 Invariant,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
21 Override,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
22 Scope,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
23 Static,
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
24 Synchronized
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
25 }
7eb83dd38901 - Simplified suffix rule and added a few more numbers to unittest.
aziz
parents: 65
diff changeset
26
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
27 private alias TOK T;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
28
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
29 class Parser
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
30 {
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
31 Lexer lx;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
32 TOK delegate() nT;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
33
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
34 Information[] errors;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
35
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
36 this(char[] srcText, string fileName)
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
37 {
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
38 lx = new Lexer(srcText, fileName);
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
39 nT = &lx.nextToken;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
40 }
70
0d3ef6daec04 - Added Expression class stubs.
aziz
parents: 69
diff changeset
41
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
42 Expression parseExpression()
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
43 {
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
44 auto e = parseAssignExpression();
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
45 while (lx.token.type == TOK.Comma)
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
46 e = new CommaExpression(e, parseExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
47 return e;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
48 }
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
49
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
50 Expression parseAssignExpression()
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
51 {
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
52 auto e = parseCondExpression();
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
53 while (1)
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
54 {
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
55 switch (lx.token.type)
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
56 {
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
57 case T.Assign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
58 nT(); e = new AssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
59 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
60 case T.LShiftAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
61 nT(); e = new LShiftAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
62 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
63 case T.RShiftAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
64 nT(); e = new RShiftAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
65 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
66 case T.URShiftAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
67 nT(); e = new URShiftAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
68 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
69 case T.OrAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
70 nT(); e = new OrAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
71 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
72 case T.AndAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
73 nT(); e = new AndAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
74 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
75 case T.PlusAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
76 nT(); e = new PlusAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
77 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
78 case T.MinusAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
79 nT(); e = new MinusAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
80 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
81 case T.DivAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
82 nT(); e = new DivAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
83 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
84 case T.MulAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
85 nT(); e = new MulAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
86 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
87 case T.ModAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
88 nT(); e = new ModAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
89 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
90 case T.XorAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
91 nT(); e = new XorAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
92 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
93 case T.CatAssign:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
94 nT(); e = new CatAssignExpression(e, parseAssignExpression());
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
95 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
96 default:
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
97 break;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
98 }
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
99 break;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
100 }
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
101 return e;
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
102 }
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
103
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
104 Expression parseCondExpression()
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
105 {
72
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
106 auto e = parseOrOrExpression();
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
107 if (lx.token.type == TOK.Question)
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
108 {
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
109 nT();
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
110 auto iftrue = parseExpression();
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
111 // if (lx.toke.type != TOK.Colon)
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
112 // error();
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
113 auto iffalse = parseCondExpression();
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
114 e = new CondExpression(e, iftrue, iffalse);
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
115 }
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
116 return e;
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
117 }
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
118
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
119 Expression parseOrOrExpression()
f75e359f939f - Added parseExpression() method.
aziz
parents: 71
diff changeset
120 {
71
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
121 return new Expression();
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
122 }
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
123
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
124 void error(MID id, ...)
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
125 {
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
126 errors ~= new Information(Information.Type.Parser, id, lx.loc, arguments(_arguments, _argptr));
b3777cca323c - Added Identity and NotIdentity tokens.
aziz
parents: 70
diff changeset
127 }
65
6c21ae79fbb3 - Renamed function Token.span to Token.srcText.
aziz
parents: 0
diff changeset
128 }