annotate trunk/src/cmd/Generate.d @ 392:bb935c6f9b7a

Applied fixes and improvements to the Lexer class. In scanDelimitedStringLiteral: - leading newlines are skipped now. - passed c instead of closing_delim to isUniAlpha(). - the matching string delimiter must follow a newline. - corrected if-statements and an assert(). Added inTokenString member: - in scanTokenStringLiteral() this member is increment at the start and decremented at the end. - in scanSpecialTokenSequence() this member is checked and #line is not evaluated if it is not zero. Added missing break to case 'L' in scanNumber(). In scanReal(): - changed debug switch to a delegate inside an assert(). - removing underscores from buffer more efficiently. Made some other trivial changes and fixes to other modules.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Mon, 17 Sep 2007 20:35:08 +0200
parents 33b566df6af4
children 6440da4adb07
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
1 /++
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
2 Author: Aziz Köksal
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
3 License: GPL3
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
4 +/
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
5 module cmd.Generate;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
6 import dil.SyntaxTree;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
7 import dil.Token;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
8 import dil.Parser, dil.Lexer;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
9 import dil.File;
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
10 import tango.io.Print;
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
11 import common;
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
12
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
13 enum DocOption
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
14 {
392
bb935c6f9b7a Applied fixes and improvements to the Lexer class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
15 Empty,
bb935c6f9b7a Applied fixes and improvements to the Lexer class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
16 Tokens = 1,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
17 Syntax = 1<<1,
392
bb935c6f9b7a Applied fixes and improvements to the Lexer class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
18 HTML = 1<<2,
bb935c6f9b7a Applied fixes and improvements to the Lexer class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
19 XML = 1<<3
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
20 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
21
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 363
diff changeset
22 void execute(string fileName, DocOption options)
1059295c2727 - Every command module has an execute method now.
aziz
parents: 363
diff changeset
23 {
392
bb935c6f9b7a Applied fixes and improvements to the Lexer class.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 391
diff changeset
24 assert(options != DocOption.Empty);
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 363
diff changeset
25 if (options & DocOption.Syntax)
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
26 syntaxToDoc(fileName, Stdout, options);
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 363
diff changeset
27 else
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
28 tokensToDoc(fileName, Stdout, options);
364
1059295c2727 - Every command module has an execute method now.
aziz
parents: 363
diff changeset
29 }
1059295c2727 - Every command module has an execute method now.
aziz
parents: 363
diff changeset
30
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
31 char[] xml_escape(char[] text)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
32 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
33 char[] result;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
34 foreach(c; text)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
35 switch(c)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
36 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
37 case '<': result ~= "&lt;"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
38 case '>': result ~= "&gt;"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
39 case '&': result ~= "&amp;"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
40 default: result ~= c;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
41 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
42 return result;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
43 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
44
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
45
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
46 /// Find object in subject and return position.
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
47 /// Returns -1 if no match was found.
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
48 int find(char[] subject, char[] object)
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
49 {
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
50 if (object.length > subject.length)
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
51 return -1;
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
52 foreach (i, c; subject)
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
53 {
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
54 if (c == object[0])
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
55 {
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
56 if (object.length > (subject.length - i))
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
57 return -1;
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
58 if (object == subject[i..i+object.length])
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
59 return i;
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
60 }
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
61 }
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
62 return -1;
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
63 }
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
64
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
65 char[] getShortClassName(Node n)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
66 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
67 static char[][] name_table;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
68 if (name_table is null)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
69 name_table = new char[][NodeKind.max+1];
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
70 char[] name = name_table[n.kind];
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
71 if (name !is null)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
72 return name;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
73
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
74 name = n.classinfo.name;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
75 name = name[find(name, ".")+1 .. $]; // Remove package name
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
76 name = name[find(name, ".")+1 .. $]; // Remove module name
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
77 char[] remove;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
78 switch (n.category)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
79 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
80 alias NodeCategory NC;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
81 case NC.Declaration: remove = "Declaration"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
82 case NC.Statement:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
83 if (n.kind == NodeKind.Statements)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
84 return name;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
85 remove = "Statement";
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
86 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
87 case NC.Expression: remove = "Expression"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
88 case NC.Type: remove = "Type"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
89 case NC.Other: return name;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
90 default:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
91 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
92 // Remove common suffix.
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
93 auto idx = find(name, remove);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
94 if (idx != -1)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
95 name = name[0 .. idx];
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
96 // Store the name.
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
97 name_table[n.kind] = name;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
98 return name;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
99 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
100
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
101 enum DocPart
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
102 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
103 Head,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
104 CompBegin,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
105 CompEnd,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
106 Error,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
107 SyntaxBegin,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
108 SyntaxEnd,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
109 SrcBegin,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
110 SrcEnd,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
111 Tail,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
112 // Tokens:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
113 Identifier,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
114 Comment,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
115 StringLiteral,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
116 CharLiteral,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
117 Operator,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
118 LorG,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
119 LessEqual,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
120 GreaterEqual,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
121 AndLogical,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
122 OrLogical,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
123 NotEqual,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
124 Not,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
125 Number,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
126 Bracket,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
127 SpecialToken,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
128 Shebang,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
129 Keyword,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
130 HLineBegin,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
131 HLineEnd,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
132 Filespec,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
133 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
134
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
135 auto html_tags = [
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
136 // Head
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
137 `<html>`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
138 `<head>`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
139 `<meta http-equiv="Content-Type" content="text/html; charset=utf-8">`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
140 `<link href="dil_html.css" rel="stylesheet" type="text/css">`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
141 `</head>`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
142 `<body>`[],
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
143 // CompBegin
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
144 `<div class="compilerinfo">`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
145 // CompEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
146 `</div>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
147 // Error
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
148 `<p class="error {0}">{1}({2}){3}: {4}</p>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
149 // SyntaxBegin
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
150 `<span class="{0} {1}">`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
151 // SyntaxEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
152 `</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
153 // SrcBegin
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
154 `<pre class="sourcecode">`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
155 // SrcEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
156 `</pre>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
157 // Tail
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
158 `</html>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
159 // Identifier
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
160 `<span class="i">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
161 // Comment
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
162 `<span class="c{0}">{1}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
163 // StringLiteral
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
164 `<span class="sl">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
165 // CharLiteral
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
166 `<span class="cl">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
167 // Operator
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
168 `<span class="op">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
169 // LorG
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
170 `<span class="oplg">&lt;&gt;</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
171 // LessEqual
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
172 `<span class="ople">&lt;=</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
173 // GreaterEqual
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
174 `<span class="opge">&gt;=</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
175 // AndLogical
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
176 `<span class="opaa">&amp;&amp;</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
177 // OrLogical
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
178 `<span class="opoo">||</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
179 // NotEqual
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
180 `<span class="opne">!=</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
181 // Not
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
182 `<span class="opn">!</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
183 // Number
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
184 `<span class="n">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
185 // Bracket
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
186 `<span class="br">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
187 // SpecialToken
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
188 `<span class="st">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
189 // Shebang
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
190 `<span class="shebang">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
191 // Keyword
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
192 `<span class="k">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
193 // HLineBegin
388
ae154eceba65 Applied some fixes to scanning and printing #line tokens.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
194 `<span class="hl">`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
195 // HLineEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
196 "</span>",
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
197 // Filespec
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
198 `<span class="fs">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
199 ];
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
200
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
201 auto xml_tags = [
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
202 // Head
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
203 `<?xml version="1.0"?>`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
204 `<?xml-stylesheet href="dil_xml.css" type="text/css"?>`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
205 `<root>`[],
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
206 // CompBegin
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
207 `<compilerinfo>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
208 // CompEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
209 `</compilerinfo>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
210 // Error
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
211 `<error t="{0}">{1}({2}){3}: {4}</error>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
212 // SyntaxBegin
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
213 `<{0} t="{1}">`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
214 // SyntaxEnd
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
215 `</{0}>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
216 // SrcBegin
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
217 `<sourcecode>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
218 // SrcEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
219 `</sourcecode>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
220 // Tail
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
221 `</root>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
222 // Identifier
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
223 "<i>{0}</i>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
224 // Comment
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
225 `<c t="{0}">{1}</c>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
226 // StringLiteral
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
227 "<sl>{0}</sl>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
228 // CharLiteral
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
229 "<cl>{0}</cl>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
230 // Operator
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
231 "<op>{0}</op>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
232 // LorG
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
233 `<op t="lg">&lt;&gt;</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
234 // LessEqual
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
235 `<op t="le">&lt;=</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
236 // GreaterEqual
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
237 `<op t="ge">&gt;=</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
238 // AndLogical
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
239 `<op t="aa">&amp;&amp;</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
240 // OrLogical
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
241 `<op t="oo">||</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
242 // NotEqual
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
243 `<op t="ne">!=</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
244 // Not
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
245 `<op t="n">!</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
246 // Number
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
247 "<n>{0}</n>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
248 // Bracket
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
249 "<br>{0}</br>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
250 // SpecialToken
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
251 "<st>{0}</st>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
252 // Shebang
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
253 "<shebang>{0}</shebang>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
254 // Keyword
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
255 "<k>{0}</k>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
256 // HLineBegin
388
ae154eceba65 Applied some fixes to scanning and printing #line tokens.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
257 "<hl>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
258 // HLineEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
259 "</hl>",
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
260 // Filespec
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
261 "<fs>{0}</fs>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
262 ];
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
263
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
264 static assert(html_tags.length == DocPart.max+1);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
265 static assert(xml_tags.length == DocPart.max+1);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
266
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
267 void syntaxToDoc(string fileName, Print!(char) print, DocOption options)
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
268 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
269 auto tags = options & DocOption.HTML ? html_tags : xml_tags;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
270 auto sourceText = loadFile(fileName);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
271 auto parser = new Parser(sourceText, fileName);
368
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 364
diff changeset
272 auto root = parser.start();
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
273 auto lx = parser.lx;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
274
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
275 auto token = lx.head;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
276
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
277 print(tags[DocPart.Head]~\n);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
278 // Output error messages.
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
279 if (lx.errors.length || parser.errors.length)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
280 {
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
281 print(tags[DocPart.CompBegin]~\n);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
282 foreach (error; lx.errors)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
283 {
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
284 print.formatln(tags[DocPart.Error], "L", lx.fileName, error.loc, "L", xml_escape(error.getMsg));
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
285 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
286 foreach (error; parser.errors)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
287 {
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
288 print.formatln(tags[DocPart.Error], "P", lx.fileName, error.loc, "P", xml_escape(error.getMsg));
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
289 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
290 print(tags[DocPart.CompEnd]~\n);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
291 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
292 print(tags[DocPart.SrcBegin]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
293
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
294 Node[][Token*] beginNodes, endNodes;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
295
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
296 void populateAAs(Node[] nodes)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
297 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
298 foreach (node; nodes)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
299 {
379
a92f7826a4fa - Fix in parseTemplateArguments_(): calling nested parseType_() instead of parseType() in try_().
aziz
parents: 368
diff changeset
300 assert(node !is null);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
301 auto begin = node.begin;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
302 if (begin)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
303 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
304 auto end = node.end;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
305 assert(end);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
306 beginNodes[begin] ~= node;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
307 endNodes[end] ~= node;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
308 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
309 if (node.children.length)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
310 populateAAs(node.children);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
311 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
312 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
313 populateAAs(root.children);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
314
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
315 char[] getTag(NodeCategory nc)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
316 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
317 char[] tag;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
318 switch (nc)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
319 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
320 alias NodeCategory NC;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
321 case NC.Declaration: tag = "d"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
322 case NC.Statement: tag = "s"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
323 case NC.Expression: tag = "e"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
324 case NC.Type: tag = "t"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
325 case NC.Other: tag = "o"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
326 default:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
327 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
328 return tag;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
329 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
330
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
331 // Traverse linked list and print tokens.
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
332 while (token.type != TOK.EOF)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
333 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
334 token = token.next;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
335
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
336 Node[]* nodes = token in beginNodes;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
337
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
338 if (nodes)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
339 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
340 foreach (node; *nodes)
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
341 print.format(tags[DocPart.SyntaxBegin], getTag(node.category), getShortClassName(node));
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
342 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
343
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
344 printToken(token, tags, print);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
345
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
346 nodes = token in endNodes;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
347
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
348 if (nodes)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
349 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
350 foreach_reverse (node; *nodes)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
351 if (options & DocOption.HTML)
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
352 print(tags[DocPart.SyntaxEnd]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
353 else
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
354 print.format(tags[DocPart.SyntaxEnd], getTag(node.category));
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
355 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
356 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
357 print(\n~tags[DocPart.SrcEnd])(\n~tags[DocPart.Tail]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
358 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
359
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
360 void tokensToDoc(string fileName, Print!(char) print, DocOption options)
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
361 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
362 auto tags = options & DocOption.HTML ? html_tags : xml_tags;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
363 auto sourceText = loadFile(fileName);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
364 auto lx = new Lexer(sourceText, fileName);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
365
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
366 auto token = lx.getTokens();
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
367
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
368 print(tags[DocPart.Head]~\n);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
369
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
370 if (lx.errors.length)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
371 {
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
372 print(tags[DocPart.CompBegin]~\n);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
373 foreach (error; lx.errors)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
374 {
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
375 print.formatln(tags[DocPart.Error], "L", lx.fileName, error.loc, "L", xml_escape(error.getMsg));
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
376 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
377 print(tags[DocPart.CompEnd]~\n);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
378 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
379 print(tags[DocPart.SrcBegin]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
380
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
381 // Traverse linked list and print tokens.
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
382 while (token.type != TOK.EOF)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
383 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
384 token = token.next;
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
385 printToken(token, tags, print);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
386 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
387 print(\n~tags[DocPart.SrcEnd])(\n~tags[DocPart.Tail]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
388 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
389
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
390 void printToken(Token* token, string[] tags, Print!(char) print)
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
391 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
392 alias DocPart DP;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
393 string srcText = xml_escape(token.srcText);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
394
390
4d36eea1bbc9 Refactored Lexer.scan().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 389
diff changeset
395 // Print whitespace.
4d36eea1bbc9 Refactored Lexer.scan().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 389
diff changeset
396 if (token.ws)
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
397 print(token.ws[0..token.start - token.ws]);
390
4d36eea1bbc9 Refactored Lexer.scan().
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 389
diff changeset
398
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
399 switch(token.type)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
400 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
401 case TOK.Identifier:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
402 print.format(tags[DP.Identifier], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
403 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
404 case TOK.Comment:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
405 string t;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
406 switch (token.start[1])
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
407 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
408 case '/': t = "l"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
409 case '*': t = "b"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
410 case '+': t = "n"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
411 default:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
412 assert(0);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
413 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
414 print.format(tags[DP.Comment], t, srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
415 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
416 case TOK.String:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
417 print.format(tags[DP.StringLiteral], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
418 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
419 case TOK.CharLiteral, TOK.WCharLiteral, TOK.DCharLiteral:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
420 print.format(tags[DP.CharLiteral], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
421 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
422 case TOK.Assign, TOK.Equal,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
423 TOK.Less, TOK.Greater,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
424 TOK.LShiftAssign, TOK.LShift,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
425 TOK.RShiftAssign, TOK.RShift,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
426 TOK.URShiftAssign, TOK.URShift,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
427 TOK.OrAssign, TOK.OrBinary,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
428 TOK.AndAssign, TOK.AndBinary,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
429 TOK.PlusAssign, TOK.PlusPlus, TOK.Plus,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
430 TOK.MinusAssign, TOK.MinusMinus, TOK.Minus,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
431 TOK.DivAssign, TOK.Div,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
432 TOK.MulAssign, TOK.Mul,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
433 TOK.ModAssign, TOK.Mod,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
434 TOK.XorAssign, TOK.Xor,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
435 TOK.CatAssign,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
436 TOK.Tilde,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
437 TOK.Unordered,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
438 TOK.UorE,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
439 TOK.UorG,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
440 TOK.UorGorE,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
441 TOK.UorL,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
442 TOK.UorLorE,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
443 TOK.LorEorG:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
444 print.format(tags[DP.Operator], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
445 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
446 case TOK.LorG:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
447 print(tags[DP.LorG]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
448 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
449 case TOK.LessEqual:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
450 print(tags[DP.LessEqual]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
451 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
452 case TOK.GreaterEqual:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
453 print(tags[DP.GreaterEqual]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
454 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
455 case TOK.AndLogical:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
456 print(tags[DP.AndLogical]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
457 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
458 case TOK.OrLogical:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
459 print(tags[DP.OrLogical]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
460 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
461 case TOK.NotEqual:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
462 print(tags[DP.NotEqual]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
463 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
464 case TOK.Not:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
465 // Check if this is part of a template instantiation.
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
466 // TODO: comments aren't skipped. Use Token.nextNWS and Token.prevNWS
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
467 if (token.prev.type == TOK.Identifier && token.next.type == TOK.LParen)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
468 goto default;
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
469 print(tags[DP.Not]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
470 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
471 case TOK.Int32, TOK.Int64, TOK.Uint32, TOK.Uint64,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
472 TOK.Float32, TOK.Float64, TOK.Float80,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
473 TOK.Imaginary32, TOK.Imaginary64, TOK.Imaginary80:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
474 print.format(tags[DP.Number], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
475 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
476 case TOK.LParen, TOK.RParen, TOK.LBracket,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
477 TOK.RBracket, TOK.LBrace, TOK.RBrace:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
478 print.format(tags[DP.Bracket], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
479 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
480 case TOK.Shebang:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
481 print.format(tags[DP.Shebang], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
482 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
483 case TOK.HashLine:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
484 void printWS(char* start, char* end)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
485 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
486 if (start != end)
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
487 print(start[0 .. end - start]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
488 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
489 print(tags[DP.HLineBegin]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
490 auto num = token.line_num;
388
ae154eceba65 Applied some fixes to scanning and printing #line tokens.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
491 if (num is null)
ae154eceba65 Applied some fixes to scanning and printing #line tokens.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
492 {
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
493 print(token.srcText);
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
494 print(tags[DP.HLineEnd]);
388
ae154eceba65 Applied some fixes to scanning and printing #line tokens.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
495 break;
ae154eceba65 Applied some fixes to scanning and printing #line tokens.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
496 }
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
497 // Print whitespace between #line and number
388
ae154eceba65 Applied some fixes to scanning and printing #line tokens.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
498 auto ptr = token.start;
ae154eceba65 Applied some fixes to scanning and printing #line tokens.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
499 printWS(ptr, num.start); // prints "#line" as well
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
500 printToken(num, tags, print);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
501 if (token.line_filespec)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
502 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
503 auto filespec = token.line_filespec;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
504 // Print whitespace between number and filespec
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
505 printWS(num.end, filespec.start);
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
506 print.format(tags[DP.Filespec], xml_escape(filespec.srcText));
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
507
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
508 ptr = filespec.end;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
509 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
510 else
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
511 ptr = num.end;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
512 // Print remaining whitespace
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
513 printWS(ptr, token.end);
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
514 print(tags[DP.HLineEnd]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
515 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
516 default:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
517 if (token.isKeyword())
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
518 print.format(tags[DP.Keyword], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
519 else if (token.isSpecialToken)
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
520 print.format(tags[DP.SpecialToken], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
521 else
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
522 print(srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
523 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
524 }