Mercurial > projects > dil
annotate trunk/src/docgen/config/reader.d @ 455:f92505ad18ab
Simple configuration reader, small modifications.
author | Jari-Matti M?kel? <jmjm@iki.fi> |
---|---|
date | Mon, 29 Oct 2007 21:27:02 +0200 |
parents | |
children | 33a4cb255fcc |
rev | line source |
---|---|
455
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
1 module docgen.config.reader; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
2 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
3 debug import tango.io.Stdout; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
4 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
5 char[][] lex(char[] input) { |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
6 char[][] tokens; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
7 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
8 uint state = 0, level = 0; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
9 size_t sidx = 0; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
10 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
11 void err(size_t i, int type = 0) { |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
12 auto b = input[i<20 ? 0 : i-20..i]; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
13 auto e = input[i+1..i+21>$ ? $ : i+21]; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
14 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
15 throw new Exception("Lex: " ~ |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
16 (type == 0 ? "Illegal character" : |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
17 type == 1 ? "Wrong number of parenthesis" : |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
18 "Unexpected end of input") ~ |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
19 ": " ~ b ~ " >>>" ~ input[i] ~ "<<< " ~ e ~ "." |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
20 ); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
21 } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
22 void begin(size_t i) { sidx = i; } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
23 void end(size_t i) { tokens ~= input[sidx..i]; } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
24 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
25 foreach(size_t i, c; input) { |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
26 if (sidx > i) continue; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
27 switch(c) { // states space, token, textEnd |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
28 case '"': |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
29 switch(state) { |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
30 case 0: |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
31 char[] buf; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
32 bool escape; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
33 char d; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
34 sidx = i; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
35 while(!((d = input[++sidx]) == '"' && !escape) && sidx<input.length) |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
36 if (escape) { |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
37 if (d != '"' && d != '\\') buf ~= '\\'; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
38 buf ~= d; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
39 escape = false; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
40 } else if (d == '\\') |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
41 escape = true; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
42 else |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
43 buf ~= d; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
44 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
45 sidx++; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
46 tokens ~= buf; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
47 state = 2; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
48 continue; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
49 default: err(i); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
50 } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
51 case '\\': |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
52 switch(state) { |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
53 case 0: begin(i); state = 1; continue; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
54 case 1: continue; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
55 case 2: err(i); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
56 } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
57 case ' ': |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
58 case '\t': |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
59 case '\n': |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
60 case '(': |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
61 case ')': |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
62 switch(state) { |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
63 case 1: end(i); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
64 case 0: |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
65 case 2: |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
66 switch(c) { |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
67 case '(': tokens ~= "("; level++; state = 0; break; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
68 case ')': tokens ~= ")"; if (!level--) err(i,1); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
69 default: state = 0; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
70 } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
71 } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
72 break; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
73 default: |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
74 switch(state) { |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
75 case 0: begin(i); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
76 case 1: state = 1; continue; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
77 case 2: err(i); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
78 } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
79 } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
80 } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
81 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
82 if (state == 3 || level != 0) err(input.length-1,2); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
83 if (state > 0) end(input.length); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
84 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
85 debug { |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
86 foreach(i, tok; tokens) |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
87 Stdout.format("{}{}", tok, (i != tokens.length-1 ? " " : "")); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
88 Stdout.newline; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
89 } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
90 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
91 return tokens; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
92 } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
93 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
94 char[][][char[]] parse(char[][] tokens) { |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
95 char[][][char[]] values; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
96 size_t i = 1; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
97 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
98 void err(size_t j) { |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
99 auto b = tokens[j < 5 ? 0 : j-5..j]; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
100 auto e = tokens[j+1..j+6>$ ? $ : j+6]; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
101 char[] tmp; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
102 foreach(t; b) tmp ~= t ~ " "; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
103 tmp ~= ">>>" ~ tokens[j] ~ "<<< "; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
104 foreach(t; e) tmp ~= t ~ " "; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
105 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
106 throw new Exception( |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
107 "Parse: Illegal token: " ~ tmp ~ "." |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
108 ); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
109 } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
110 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
111 if (tokens[0] != "(") err(0); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
112 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
113 void doParse(char[] prefix = null) { |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
114 if (tokens[i] == "(" || |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
115 tokens[i] == ")") err(i); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
116 if (prefix) prefix ~= "."; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
117 auto v = prefix ~ tokens[i++]; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
118 //values[v] = null; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
119 while (tokens[i] != ")") |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
120 if (tokens[i++] == "(") |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
121 doParse(v); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
122 else |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
123 values[v] ~= tokens[i-1]; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
124 i++; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
125 } |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
126 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
127 doParse(); |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
128 |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
129 return values; |
f92505ad18ab
Simple configuration reader, small modifications.
Jari-Matti M?kel? <jmjm@iki.fi>
parents:
diff
changeset
|
130 } |