annotate trunk/src/cmd/Generate.d @ 390:4d36eea1bbc9

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