Mercurial > projects > dil
annotate trunk/src/dil/doc/Parser.d @ 768:d84349a60f5c
Fixed IdentValueParser.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sat, 16 Feb 2008 22:10:21 +0100 |
parents | 8caf18892c1b |
children | 5e3ef1b2011c |
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: |
747
00f872d949ea
Added method scanCommentText() to DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
745
diff
changeset
|
23 /// <pre> |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
24 /// ident = value |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
25 /// ident2 = value2 |
747
00f872d949ea
Added method scanCommentText() to DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
745
diff
changeset
|
26 //// more text |
00f872d949ea
Added method scanCommentText() to DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
745
diff
changeset
|
27 /// </pre> |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
28 struct IdentValueParser |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
29 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
30 char* p; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
31 char* textEnd; |
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 IdentValue[] parse(string text) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
34 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
35 if (!text.length) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
36 return null; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
37 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
38 p = text.ptr; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
39 textEnd = p + text.length; |
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 IdentValue[] idvalues; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
42 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
43 string ident, nextIdent; |
768
d84349a60f5c
Fixed IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
751
diff
changeset
|
44 char* bodyBegin = p, nextBodyBegin; |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
45 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
46 // Init. |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
47 findNextIdent(ident, bodyBegin); |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
48 // Continue. |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
49 while (findNextIdent(nextIdent, nextBodyBegin)) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
50 { |
741
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
51 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
|
52 ident = nextIdent; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
53 bodyBegin = nextBodyBegin; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
54 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
55 // Add last ident value. |
741
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
56 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
|
57 return idvalues; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
58 } |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
59 |
741
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
60 /// 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
|
61 char[] textBody(char* begin, char* end) |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
62 { |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
63 // 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
|
64 // A = |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
65 // B = some text |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
66 // ^- 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
|
67 if (begin is end) |
745 | 68 return ""; |
741
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
69 // Remove trailing whitespace. |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
70 while (isspace(*--end) || *end == '\n') |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
71 {} |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
72 end++; |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
73 return makeString(begin, end); |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
74 } |
35184354a502
Added method textBody() to IdentValueParser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
737
diff
changeset
|
75 |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
76 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
|
77 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
78 while (p < textEnd) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
79 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
80 skipWhitespace(); |
737
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
727
diff
changeset
|
81 if (p >= textEnd) |
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
727
diff
changeset
|
82 break; |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
83 auto idBegin = p; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
84 if (isidbeg(*p) || isUnicodeAlpha(p, textEnd)) // IdStart |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
85 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
86 do // IdChar* |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
87 p++; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
88 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
|
89 auto idEnd = p; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
90 |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
91 skipWhitespace(); |
737
f88b5285b86b
Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
727
diff
changeset
|
92 if (p < textEnd && *p == '=') |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
93 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
94 p++; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
95 skipWhitespace(); |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
96 bodyBegin = p; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
97 ident = makeString(idBegin, idEnd); |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
98 return true; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
99 } |
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 skipLine(); |
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 return false; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
104 } |
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 void skipWhitespace() |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
107 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
108 while (p < textEnd && (isspace(*p) || *p == '\n')) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
109 p++; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
110 } |
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 void skipLine() |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
113 { |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
114 while (p < textEnd && *p != '\n') |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
115 p++; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
116 p++; |
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 } |
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 char[] makeString(char* begin, char* end) |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
121 { |
751
8caf18892c1b
Improved DDocEmitter and fixed bugs.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
747
diff
changeset
|
122 assert(begin <= end); |
727
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
123 return begin[0 .. end - begin]; |
c204b6a9e0ef
Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
124 } |