annotate trunk/src/cmd/Generate.d @ 485:ea8c7459f1c4

Changed a lot of things in the Lexer. Newlines are tokenized now, instead of being treated as whitespace. Newline tokens store location info as well, which make quite a few functions unnecessary. Added a static method getLocation() which returns a Location instance for any given token. This will also be very useful for finding the location of AST nodes (through Node.begin,) which is needed for reporting parser and semantic errors and emitting documentation. Removed rescanNewlines(), LocState, getState(), restoreState(), evaluateHashLine() and updateErrorLoc(). Added isUnicodeNewlineChar(), isUnicodeNewline(), isNewline(), isNewlineEnd(), isEndOfLine(), scanNewline(), getLocation() and error_(). Replaced some clunky expressions with isascii(), isNewlineEnd(), isEndOfLine(), isUnicodeNewline(), isUnicodeNewlineChar(). Fix in scanNormalStringLiteral(): scanPostfix() must be before label Lreturn. Fixed Lexer unittest. Fix in parseDeclarationDefinitionsBlock(): 'token' should be 'begin'. Added method isMultiline() to Token and added documentation comments.: File name too long abort: file /home/aziz/dil/trunk/Changed a lot of things in the Lexer. Newlines are tokenized now, instead of being treated as whitespace. Newline tokens store location info as well, which make quite a few functions unnecessary. Added a static method getLocation() which returns a Location instance for any given token. This will also be very useful for finding the location of AST nodes (through Node.begin,) which is needed for reporting parser and semantic errors and emitting documentation. Removed rescanNewlines(), LocState, getState(), restoreState(), evaluateHashLine() and updateErrorLoc(). Added isUnicodeNewlineChar(), isUnicodeNewline(), isNewline(), isNewlineEnd(), isEndOfLine(), scanNewline(), getLocation() and error_(). Replaced some clunky expressions with isascii(), isNewlineEnd(), isEndOfLine(), isUnicodeNewline(), isUnicodeNewlineChar(). Fix in scanNormalStringLiteral(): scanPostfix() must be before label Lreturn. Fixed Lexer unittest. Fix in parseDeclarationDefinitionsBlock(): 'token' should be 'begin'. Added method isMultiline() to Token and added documentation comments.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Fri, 30 Nov 2007 20:17:29 +0100
parents ad7977fe315a
children 996041463028
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;
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
81 case NC.Declaration:
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
82 if (n.kind == NodeKind.Declarations)
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
83 return name;
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
84 remove = "Declaration";
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
85 break;
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
86 case NC.Statement:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
87 if (n.kind == NodeKind.Statements)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
88 return name;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
89 remove = "Statement";
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
90 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
91 case NC.Expression: remove = "Expression"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
92 case NC.Type: remove = "Type"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
93 case NC.Other: return name;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
94 default:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
95 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
96 // Remove common suffix.
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
97 auto idx = find(name, remove);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
98 if (idx != -1)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
99 name = name[0 .. idx];
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
100 // Store the name.
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
101 name_table[n.kind] = name;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
102 return name;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
103 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
104
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
105 enum DocPart
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
106 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
107 Head,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
108 CompBegin,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
109 CompEnd,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
110 Error,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
111 SyntaxBegin,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
112 SyntaxEnd,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
113 SrcBegin,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
114 SrcEnd,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
115 Tail,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
116 // Tokens:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
117 Identifier,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
118 Comment,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
119 StringLiteral,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
120 CharLiteral,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
121 Operator,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
122 LorG,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
123 LessEqual,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
124 GreaterEqual,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
125 AndLogical,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
126 OrLogical,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
127 NotEqual,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
128 Not,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
129 Number,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
130 Bracket,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
131 SpecialToken,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
132 Shebang,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
133 Keyword,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
134 HLineBegin,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
135 HLineEnd,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
136 Filespec,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
137 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
138
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
139 auto html_tags = [
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
140 // Head
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
141 `<html>`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
142 `<head>`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
143 `<meta http-equiv="Content-Type" content="text/html; charset=utf-8">`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
144 `<link href="dil_html.css" rel="stylesheet" type="text/css">`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
145 `</head>`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
146 `<body>`[],
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
147 // CompBegin
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
148 `<div class="compilerinfo">`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
149 // CompEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
150 `</div>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
151 // Error
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
152 `<p class="error {0}">{1}({2}){3}: {4}</p>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
153 // SyntaxBegin
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
154 `<span class="{0} {1}">`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
155 // SyntaxEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
156 `</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
157 // SrcBegin
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
158 `<pre class="sourcecode">`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
159 // SrcEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
160 `</pre>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
161 // Tail
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
162 `</html>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
163 // Identifier
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
164 `<span class="i">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
165 // Comment
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
166 `<span class="c{0}">{1}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
167 // StringLiteral
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
168 `<span class="sl">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
169 // CharLiteral
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
170 `<span class="cl">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
171 // Operator
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
172 `<span class="op">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
173 // LorG
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
174 `<span class="oplg">&lt;&gt;</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
175 // LessEqual
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
176 `<span class="ople">&lt;=</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
177 // GreaterEqual
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
178 `<span class="opge">&gt;=</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
179 // AndLogical
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
180 `<span class="opaa">&amp;&amp;</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
181 // OrLogical
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
182 `<span class="opoo">||</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
183 // NotEqual
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
184 `<span class="opne">!=</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
185 // Not
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
186 `<span class="opn">!</span>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
187 // Number
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
188 `<span class="n">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
189 // Bracket
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
190 `<span class="br">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
191 // SpecialToken
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
192 `<span class="st">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
193 // Shebang
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
194 `<span class="shebang">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
195 // Keyword
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
196 `<span class="k">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
197 // HLineBegin
388
ae154eceba65 Applied some fixes to scanning and printing #line tokens.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
198 `<span class="hl">`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
199 // HLineEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
200 "</span>",
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
201 // Filespec
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
202 `<span class="fs">{0}</span>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
203 ];
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
204
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
205 auto xml_tags = [
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
206 // Head
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
207 `<?xml version="1.0"?>`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
208 `<?xml-stylesheet href="dil_xml.css" type="text/css"?>`\n
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
209 `<root>`[],
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
210 // CompBegin
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
211 `<compilerinfo>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
212 // CompEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
213 `</compilerinfo>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
214 // Error
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
215 `<error t="{0}">{1}({2}){3}: {4}</error>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
216 // SyntaxBegin
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
217 `<{0} t="{1}">`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
218 // SyntaxEnd
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
219 `</{0}>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
220 // SrcBegin
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
221 `<sourcecode>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
222 // SrcEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
223 `</sourcecode>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
224 // Tail
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
225 `</root>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
226 // Identifier
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
227 "<i>{0}</i>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
228 // Comment
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
229 `<c t="{0}">{1}</c>`,
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
230 // StringLiteral
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
231 "<sl>{0}</sl>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
232 // CharLiteral
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
233 "<cl>{0}</cl>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
234 // Operator
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
235 "<op>{0}</op>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
236 // LorG
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
237 `<op t="lg">&lt;&gt;</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
238 // LessEqual
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
239 `<op t="le">&lt;=</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
240 // GreaterEqual
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
241 `<op t="ge">&gt;=</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
242 // AndLogical
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
243 `<op t="aa">&amp;&amp;</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
244 // OrLogical
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
245 `<op t="oo">||</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
246 // NotEqual
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
247 `<op t="ne">!=</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
248 // Not
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
249 `<op t="n">!</op>`,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
250 // Number
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
251 "<n>{0}</n>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
252 // Bracket
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
253 "<br>{0}</br>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
254 // SpecialToken
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
255 "<st>{0}</st>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
256 // Shebang
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
257 "<shebang>{0}</shebang>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
258 // Keyword
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
259 "<k>{0}</k>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
260 // HLineBegin
388
ae154eceba65 Applied some fixes to scanning and printing #line tokens.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
261 "<hl>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
262 // HLineEnd
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
263 "</hl>",
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
264 // Filespec
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
265 "<fs>{0}</fs>",
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
266 ];
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
267
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
268 static assert(html_tags.length == DocPart.max+1);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
269 static assert(xml_tags.length == DocPart.max+1);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
270
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
271 void syntaxToDoc(string fileName, Print!(char) print, DocOption options)
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
272 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
273 auto tags = options & DocOption.HTML ? html_tags : xml_tags;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
274 auto sourceText = loadFile(fileName);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
275 auto parser = new Parser(sourceText, fileName);
368
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 364
diff changeset
276 auto root = parser.start();
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
277 auto lx = parser.lx;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
278
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
279 auto token = lx.head;
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.Head]~\n);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
282 // Output error messages.
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
283 if (lx.errors.length || parser.errors.length)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
284 {
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
285 print(tags[DocPart.CompBegin]~\n);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
286 foreach (error; lx.errors)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
287 {
422
ad7977fe315a Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
288 print.formatln(tags[DocPart.Error], "L", error.filePath, Format("{0},{1}", error.loc, error.col), "L", xml_escape(error.getMsg));
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
289 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
290 foreach (error; parser.errors)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
291 {
422
ad7977fe315a Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
292 print.formatln(tags[DocPart.Error], "P", error.filePath, Format("{0},{1}", error.loc, error.col), "P", xml_escape(error.getMsg));
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
293 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
294 print(tags[DocPart.CompEnd]~\n);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
295 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
296 print(tags[DocPart.SrcBegin]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
297
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
298 Node[][Token*] beginNodes, endNodes;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
299
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
300 void populateAAs(Node[] nodes)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
301 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
302 foreach (node; nodes)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
303 {
396
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
304 assert(delegate bool(){
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
305 foreach (child; node.children)
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
306 if (child is null)
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
307 return false;
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
308 return true;
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
309 }() == true, Format("Node '{0}' has a null child", node.classinfo.name)
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
310 );
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
311 auto begin = node.begin;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
312 if (begin)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
313 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
314 auto end = node.end;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
315 assert(end);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
316 beginNodes[begin] ~= node;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
317 endNodes[end] ~= node;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
318 }
396
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
319
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
320 if (node.children.length)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
321 populateAAs(node.children);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
322 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
323 }
396
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
324 assert(delegate bool(){
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
325 foreach (child; root.children)
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
326 if (child is null)
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
327 return false;
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
328 return true;
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
329 }() == true, Format("Root node has a null child")
0a4619735ce9 Applied fixes to Lexer, Parser and other classes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 394
diff changeset
330 );
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
331 populateAAs(root.children);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
332
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
333 char[] getTag(NodeCategory nc)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
334 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
335 char[] tag;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
336 switch (nc)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
337 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
338 alias NodeCategory NC;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
339 case NC.Declaration: tag = "d"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
340 case NC.Statement: tag = "s"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
341 case NC.Expression: tag = "e"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
342 case NC.Type: tag = "t"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
343 case NC.Other: tag = "o"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
344 default:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
345 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
346 return tag;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
347 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
348
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
349 // Traverse linked list and print tokens.
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
350 while (token.type != TOK.EOF)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
351 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
352 token = token.next;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
353
394
6440da4adb07 Fixed forward references of enum MID complaints by compiler.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 392
diff changeset
354 // Print whitespace.
6440da4adb07 Fixed forward references of enum MID complaints by compiler.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 392
diff changeset
355 if (token.ws)
6440da4adb07 Fixed forward references of enum MID complaints by compiler.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 392
diff changeset
356 print(token.ws[0..token.start - token.ws]);
6440da4adb07 Fixed forward references of enum MID complaints by compiler.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 392
diff changeset
357
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
358 Node[]* nodes = token in beginNodes;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
359
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
360 if (nodes)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
361 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
362 foreach (node; *nodes)
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
363 print.format(tags[DocPart.SyntaxBegin], getTag(node.category), getShortClassName(node));
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
364 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
365
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
366 printToken(token, tags, print);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
367
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
368 nodes = token in endNodes;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
369
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
370 if (nodes)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
371 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
372 foreach_reverse (node; *nodes)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
373 if (options & DocOption.HTML)
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
374 print(tags[DocPart.SyntaxEnd]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
375 else
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
376 print.format(tags[DocPart.SyntaxEnd], getTag(node.category));
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
377 }
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(\n~tags[DocPart.SrcEnd])(\n~tags[DocPart.Tail]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
380 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
381
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
382 void tokensToDoc(string fileName, Print!(char) print, DocOption options)
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
383 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
384 auto tags = options & DocOption.HTML ? html_tags : xml_tags;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
385 auto sourceText = loadFile(fileName);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
386 auto lx = new Lexer(sourceText, fileName);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
387
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
388 auto token = lx.getTokens();
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 print(tags[DocPart.Head]~\n);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
391
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
392 if (lx.errors.length)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
393 {
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
394 print(tags[DocPart.CompBegin]~\n);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
395 foreach (error; lx.errors)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
396 {
422
ad7977fe315a Added support for column numbers in error messages.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 396
diff changeset
397 print.formatln(tags[DocPart.Error], "L", error.filePath, Format("{0},{1}", error.loc, error.col), "L", xml_escape(error.getMsg));
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
398 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
399 print(tags[DocPart.CompEnd]~\n);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
400 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
401 print(tags[DocPart.SrcBegin]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
402
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
403 // Traverse linked list and print tokens.
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
404 while (token.type != TOK.EOF)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
405 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
406 token = token.next;
394
6440da4adb07 Fixed forward references of enum MID complaints by compiler.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 392
diff changeset
407 // Print whitespace.
6440da4adb07 Fixed forward references of enum MID complaints by compiler.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 392
diff changeset
408 if (token.ws)
6440da4adb07 Fixed forward references of enum MID complaints by compiler.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 392
diff changeset
409 print(token.ws[0..token.start - token.ws]);
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
410 printToken(token, tags, print);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
411 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
412 print(\n~tags[DocPart.SrcEnd])(\n~tags[DocPart.Tail]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
413 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
414
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
415 void printToken(Token* token, string[] tags, Print!(char) print)
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
416 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
417 alias DocPart DP;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
418 string srcText = xml_escape(token.srcText);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
419
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
420 switch(token.type)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
421 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
422 case TOK.Identifier:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
423 print.format(tags[DP.Identifier], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
424 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
425 case TOK.Comment:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
426 string t;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
427 switch (token.start[1])
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
428 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
429 case '/': t = "l"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
430 case '*': t = "b"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
431 case '+': t = "n"; break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
432 default:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
433 assert(0);
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
434 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
435 print.format(tags[DP.Comment], t, srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
436 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
437 case TOK.String:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
438 print.format(tags[DP.StringLiteral], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
439 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
440 case TOK.CharLiteral, TOK.WCharLiteral, TOK.DCharLiteral:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
441 print.format(tags[DP.CharLiteral], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
442 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
443 case TOK.Assign, TOK.Equal,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
444 TOK.Less, TOK.Greater,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
445 TOK.LShiftAssign, TOK.LShift,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
446 TOK.RShiftAssign, TOK.RShift,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
447 TOK.URShiftAssign, TOK.URShift,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
448 TOK.OrAssign, TOK.OrBinary,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
449 TOK.AndAssign, TOK.AndBinary,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
450 TOK.PlusAssign, TOK.PlusPlus, TOK.Plus,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
451 TOK.MinusAssign, TOK.MinusMinus, TOK.Minus,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
452 TOK.DivAssign, TOK.Div,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
453 TOK.MulAssign, TOK.Mul,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
454 TOK.ModAssign, TOK.Mod,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
455 TOK.XorAssign, TOK.Xor,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
456 TOK.CatAssign,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
457 TOK.Tilde,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
458 TOK.Unordered,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
459 TOK.UorE,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
460 TOK.UorG,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
461 TOK.UorGorE,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
462 TOK.UorL,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
463 TOK.UorLorE,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
464 TOK.LorEorG:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
465 print.format(tags[DP.Operator], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
466 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
467 case TOK.LorG:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
468 print(tags[DP.LorG]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
469 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
470 case TOK.LessEqual:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
471 print(tags[DP.LessEqual]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
472 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
473 case TOK.GreaterEqual:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
474 print(tags[DP.GreaterEqual]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
475 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
476 case TOK.AndLogical:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
477 print(tags[DP.AndLogical]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
478 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
479 case TOK.OrLogical:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
480 print(tags[DP.OrLogical]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
481 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
482 case TOK.NotEqual:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
483 print(tags[DP.NotEqual]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
484 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
485 case TOK.Not:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
486 // 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
487 // TODO: comments aren't skipped. Use Token.nextNWS and Token.prevNWS
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
488 if (token.prev.type == TOK.Identifier && token.next.type == TOK.LParen)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
489 goto default;
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
490 print(tags[DP.Not]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
491 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
492 case TOK.Int32, TOK.Int64, TOK.Uint32, TOK.Uint64,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
493 TOK.Float32, TOK.Float64, TOK.Float80,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
494 TOK.Imaginary32, TOK.Imaginary64, TOK.Imaginary80:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
495 print.format(tags[DP.Number], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
496 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
497 case TOK.LParen, TOK.RParen, TOK.LBracket,
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
498 TOK.RBracket, TOK.LBrace, TOK.RBrace:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
499 print.format(tags[DP.Bracket], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
500 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
501 case TOK.Shebang:
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
502 print.format(tags[DP.Shebang], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
503 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
504 case TOK.HashLine:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
505 void printWS(char* start, char* end)
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
506 {
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
507 if (start != end)
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
508 print(start[0 .. end - start]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
509 }
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
510 print(tags[DP.HLineBegin]);
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
511 auto num = token.tokLineNum;
388
ae154eceba65 Applied some fixes to scanning and printing #line tokens.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
512 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
513 {
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
514 print(token.srcText);
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
515 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
516 break;
ae154eceba65 Applied some fixes to scanning and printing #line tokens.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 379
diff changeset
517 }
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
518 // 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
519 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
520 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
521 printToken(num, tags, print);
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
522 if (token.tokLineFilespec)
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
523 {
485
ea8c7459f1c4 Changed a lot of things in the Lexer.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 422
diff changeset
524 auto filespec = token.tokLineFilespec;
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
525 // Print whitespace between number and filespec
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
526 printWS(num.end, filespec.start);
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
527 print.format(tags[DP.Filespec], xml_escape(filespec.srcText));
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
528
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
529 ptr = filespec.end;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
530 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
531 else
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
532 ptr = num.end;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
533 // Print remaining whitespace
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
534 printWS(ptr, token.end);
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
535 print(tags[DP.HLineEnd]);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
536 break;
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
537 default:
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
538 if (token.isKeyword())
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
539 print.format(tags[DP.Keyword], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
540 else if (token.isSpecialToken)
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
541 print.format(tags[DP.SpecialToken], srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
542 else
391
33b566df6af4 Migrated project to Tango.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 390
diff changeset
543 print(srcText);
363
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
544 }
2b387a3c6b58 - Added package cmd.
aziz
parents:
diff changeset
545 }