annotate trunk/src/dil/Settings.d @ 368:2adf808343d6

- Renamed method start() to init() in Parser. - Renamed method parseModule() to start() in Parser. - Added method parseModuleDeclaration(). - Added class ImportParser which inherits from Parser. It's used as a lightweight parser for parsing module and import declarations. - Added member isLightweight to Module. - Removed calls to Parser.parseModule() and replaced them with Parser.start().
author aziz
date Sat, 01 Sep 2007 11:23:01 +0000
parents dda55fae37de
children 33b566df6af4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
1 /++
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
2 Author: Aziz Köksal
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
3 License: GPL3
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
4 +/
326
4a7359b88c11 - Added package 'dil' to module declarations.
aziz
parents: 325
diff changeset
5 module dil.Settings;
327
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
6 import dil.Messages;
a48a987f7515 - Added package dil to import declarations.
aziz
parents: 326
diff changeset
7 import dil.Parser, dil.SyntaxTree, dil.Declarations, dil.Expressions;
358
0faf57d99c1c - Replaced calls to std.file.read() with dil.loadFile().
aziz
parents: 349
diff changeset
8 import dil.File;
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
9 import std.metastrings;
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
10
331
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
11 template Pad(char[] str, uint amount)
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
12 {
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
13 static if (str.length >= amount)
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
14 const char[] Pad = str;
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
15 else
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
16 const char[] Pad = "0" ~ Pad!(str, amount-1);
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
17 }
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
18
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
19 template Pad(int num, uint amount)
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
20 {
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
21 const char[] Pad = Pad!(ToString!(num), amount);
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
22 }
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
23
333
268d680d5275 - Moved Pad template to the top.
aziz
parents: 331
diff changeset
24 version(D2)
268d680d5275 - Moved Pad template to the top.
aziz
parents: 331
diff changeset
25 {
268d680d5275 - Moved Pad template to the top.
aziz
parents: 331
diff changeset
26 const VERSION_MAJOR = 2;
268d680d5275 - Moved Pad template to the top.
aziz
parents: 331
diff changeset
27 const VERSION_MINOR = 0;
268d680d5275 - Moved Pad template to the top.
aziz
parents: 331
diff changeset
28 }
268d680d5275 - Moved Pad template to the top.
aziz
parents: 331
diff changeset
29 else
268d680d5275 - Moved Pad template to the top.
aziz
parents: 331
diff changeset
30 {
268d680d5275 - Moved Pad template to the top.
aziz
parents: 331
diff changeset
31 const VERSION_MAJOR = 1;
268d680d5275 - Moved Pad template to the top.
aziz
parents: 331
diff changeset
32 const VERSION_MINOR = 0;
268d680d5275 - Moved Pad template to the top.
aziz
parents: 331
diff changeset
33 }
268d680d5275 - Moved Pad template to the top.
aziz
parents: 331
diff changeset
34
331
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
35 const string VERSION = Format!("%s.%s", VERSION_MAJOR, Pad!(VERSION_MINOR, 3));
343
95f1b6e43214 - Removed TOK.Special and added an own entry for each special token.
aziz
parents: 339
diff changeset
36 const VENDOR = "dil";
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
37
339
9954367bcd4b - Removed usageGenerate from Settings.d. Added some comments.
aziz
parents: 333
diff changeset
38 /// Used in main help message.
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
39 const COMPILED_WITH = __VENDOR__;
339
9954367bcd4b - Removed usageGenerate from Settings.d. Added some comments.
aziz
parents: 333
diff changeset
40 /// ditto
331
cff12a1999ae - Added template Pad for padding numbers.
aziz
parents: 329
diff changeset
41 const COMPILED_VERSION = Format!("%s.%s", __VERSION__/1000, Pad!(__VERSION__%1000, 3));
339
9954367bcd4b - Removed usageGenerate from Settings.d. Added some comments.
aziz
parents: 333
diff changeset
42 /// ditto
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
43 const COMPILED_DATE = __TIMESTAMP__;
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
44
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
45 struct GlobalSettings
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
46 {
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
47 static:
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
48 string language; /// Language of messages catalogue to load.
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
49 string[] messages; /// Table of localized compiler messages.
367
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
50 string[] importPaths; /// Array of import paths to look for modules.
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
51 void load()
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
52 {
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
53 auto fileName = "config.d"[];
358
0faf57d99c1c - Replaced calls to std.file.read() with dil.loadFile().
aziz
parents: 349
diff changeset
54 auto sourceText = loadFile(fileName);
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
55 auto parser = new Parser(sourceText, fileName);
368
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
56 auto root = parser.start();
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
57
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
58 if (parser.errors.length || parser.lx.errors.length)
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
59 {
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
60 throw new Exception("There are errors in " ~ fileName ~ ".");
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
61 }
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
62
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
63 foreach (decl; root.children)
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
64 {
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
65 auto v = Cast!(VariableDeclaration)(decl);
367
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
66 if (v is null)
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
67 continue;
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
68 auto vname = v.idents[0].srcText;
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
69 if (vname == "langfile")
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
70 {
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
71 auto e = v.values[0];
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
72 if (!e)
349
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
73 throw new Exception("langfile variable has no value set.");
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
74 auto val = Cast!(StringLiteralsExpression)(e);
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
75 if (val)
349
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
76 // Set fileName to d-file with messages table.
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
77 fileName = val.getString();
367
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
78 }
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
79 else if (vname == "import_paths")
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
80 {
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
81 auto e = v.values[0];
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
82 if (e is null)
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
83 throw new Exception("import_paths variable has no variable set.");
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
84 if (auto array = Cast!(ArrayInitializer)(e))
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
85 {
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
86 foreach (value; array.values)
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
87 if (auto str = Cast!(StringLiteralsExpression)(value))
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
88 GlobalSettings.importPaths ~= str.getString();
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
89 }
367
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
90 else
dda55fae37de - ImportGraph.execute() can parse all modules depending on the imports of the root module.
aziz
parents: 358
diff changeset
91 throw new Exception("import_paths variable is set to "~e.classinfo.name~" instead of an ArrayInitializer.");
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
92 }
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
93 }
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
94
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
95 // Load messages
358
0faf57d99c1c - Replaced calls to std.file.read() with dil.loadFile().
aziz
parents: 349
diff changeset
96 sourceText = loadFile(fileName);
349
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
97 parser = new Parser(sourceText, fileName);
368
2adf808343d6 - Renamed method start() to init() in Parser.
aziz
parents: 367
diff changeset
98 root = parser.start();
349
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
99
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
100 if (parser.errors.length || parser.lx.errors.length)
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
101 {
349
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
102 throw new Exception("There are errors in "~fileName~".");
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
103 }
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
104
349
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
105 char[][] messages;
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
106 foreach (decl; root.children)
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
107 {
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
108 auto v = Cast!(VariableDeclaration)(decl);
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
109 if (v is null)
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
110 continue;
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
111 if (v.idents[0].srcText == "messages")
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
112 {
349
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
113 auto e = v.values[0];
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
114 if (!e)
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
115 throw new Exception("messages variable in "~fileName~" has no value set.");
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
116 if (auto array = Cast!(ArrayInitializer)(e))
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
117 {
349
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
118 foreach (value; array.values)
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
119 {
349
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
120 if (auto str = Cast!(StringLiteralsExpression)(value))
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
121 messages ~= str.getString();
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
122 }
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
123 }
349
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
124 else
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
125 throw new Exception("messages variable is set to "~e.classinfo.name~" instead of an ArrayInitializer.");
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
126 }
349
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
127 else if(v.idents[0].srcText == "lang_code")
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
128 {
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
129 auto e = v.values[0];
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
130 if (!e)
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
131 throw new Exception("lang_code variable in "~fileName~" has no value set.");
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
132 if (auto str = Cast!(StringLiteralsExpression)(e))
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
133 GlobalSettings.language = str.getString();
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
134 }
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
135 }
349
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
136 if (messages.length != MID.max+1)
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
137 throw new Exception(std.string.format("messages table in %s must exactly have %d entries, but %s were found.", fileName, MID.max+1, messages.length));
a0711c57c1db - Added variable 'lang_code' to language files.
aziz
parents: 343
diff changeset
138 GlobalSettings.messages = messages;
309
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
139 }
b4d842b0d2c7 - Added new files Settings.d, config.d and lang_en.d
aziz
parents:
diff changeset
140 }