Mercurial > projects > dil
annotate trunk/src/dil/doc/Parser.d @ 741:35184354a502
Added method textBody() to IdentValueParser.
Applied some fixes.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sat, 09 Feb 2008 16:18:53 +0100 |
parents | f88b5285b86b |
children | 7299159c3a19 |
rev | line source |
---|---|
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
1 /++ |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
2 Author: Aziz Köksal |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
3 License: GPL3 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
4 +/ |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
5 module dil.doc.Parser; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
6 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
7 import dil.lexer.Funcs; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
8 import dil.Unicode; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
9 import common; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
10 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
11 class IdentValue |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
12 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
13 string ident; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
14 string value; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
15 this (string ident, string value) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
16 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
17 this.ident = ident; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
18 this.value = value; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
19 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
20 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
21 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
22 /// Parses text of the form: |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
23 /// ident = value |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
24 /// ident2 = value2 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
25 /// more text |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
26 struct IdentValueParser |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
27 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
28 char* p; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
29 char* textEnd; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
30 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
31 IdentValue[] parse(string text) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
32 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
33 if (!text.length) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
34 return null; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
35 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
36 p = text.ptr; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
37 textEnd = p + text.length; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
38 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
39 IdentValue[] idvalues; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
40 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
41 string ident, nextIdent; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
42 char* bodyBegin, nextBodyBegin; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
43 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
44 // Init. |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
45 findNextIdent(ident, bodyBegin); |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
46 // Continue. |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
47 while (findNextIdent(nextIdent, nextBodyBegin)) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
48 { |
741
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
49 idvalues ~= new IdentValue(ident, textBody(bodyBegin, nextIdent.ptr)); |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
50 ident = nextIdent; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
51 bodyBegin = nextBodyBegin; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
52 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
53 // Add last ident value. |
741
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
54 idvalues ~= new IdentValue(ident, textBody(bodyBegin, textEnd)); |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
55 return idvalues; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
56 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
57 |
741
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
58 /// Removes trailing whitespace characters from the text body. |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
59 char[] textBody(char* begin, char* end) |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
60 { |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
61 // The body of A is empty, e.g.: |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
62 // A = |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
63 // B = some text |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
64 // ^- begin and end point to B (or to this.textEnd in the 2nd case.) |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
65 if (begin is end) |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
66 return null; |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
67 // Remove trailing whitespace. |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
68 while (isspace(*--end) || *end == '\n') |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
69 {} |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
70 end++; |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
71 return makeString(begin, end); |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
72 } |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
73 |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
74 bool findNextIdent(ref string ident, ref char* bodyBegin) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
75 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
76 while (p < textEnd) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
77 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
78 skipWhitespace(); |
737
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
727
diff
changeset
|
79 if (p >= textEnd) |
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
727
diff
changeset
|
80 break; |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
81 auto idBegin = p; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
82 if (isidbeg(*p) || isUnicodeAlpha(p, textEnd)) // IdStart |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
83 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
84 do // IdChar* |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
85 p++; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
86 while (p < textEnd && (isident(*p) || isUnicodeAlpha(p, textEnd))) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
87 auto idEnd = p; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
88 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
89 skipWhitespace(); |
737
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
727
diff
changeset
|
90 if (p < textEnd && *p == '=') |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
91 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
92 p++; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
93 skipWhitespace(); |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
94 bodyBegin = p; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
95 ident = makeString(idBegin, idEnd); |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
96 return true; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
97 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
98 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
99 skipLine(); |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
100 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
101 return false; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
102 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
103 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
104 void skipWhitespace() |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
105 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
106 while (p < textEnd && (isspace(*p) || *p == '\n')) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
107 p++; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
108 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
109 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
110 void skipLine() |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
111 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
112 while (p < textEnd && *p != '\n') |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
113 p++; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
114 p++; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
115 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
116 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
117 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
118 char[] makeString(char* begin, char* end) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
119 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
120 return begin[0 .. end - begin]; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
121 } |