annotate trunk/src/dil/doc/Parser.d @ 737:f88b5285b86b

Implemented DDocEmitter. Fixed quite a few bugs.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Sat, 09 Feb 2008 02:00:20 +0100
parents c204b6a9e0ef
children 35184354a502
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 {
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
49 idvalues ~= new IdentValue(ident, makeString(bodyBegin, nextIdent.ptr));
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.
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
54 idvalues ~= new IdentValue(ident, makeString(bodyBegin, textEnd));
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
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
58 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
59 {
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
60 while (p < textEnd)
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
61 {
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
62 skipWhitespace();
737
f88b5285b86b Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 727
diff changeset
63 if (p >= textEnd)
f88b5285b86b Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 727
diff changeset
64 break;
727
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
65 auto idBegin = p;
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
66 if (isidbeg(*p) || isUnicodeAlpha(p, textEnd)) // IdStart
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
67 {
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
68 do // IdChar*
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
69 p++;
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
70 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
71 auto idEnd = p;
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
72
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
73 skipWhitespace();
737
f88b5285b86b Implemented DDocEmitter.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents: 727
diff changeset
74 if (p < textEnd && *p == '=')
727
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 p++;
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
77 skipWhitespace();
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
78 bodyBegin = p;
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
79 ident = makeString(idBegin, idEnd);
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
80 return true;
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
81 }
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
82 }
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
83 skipLine();
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
84 }
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
85 return false;
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
86 }
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
87
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
88 void skipWhitespace()
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
89 {
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
90 while (p < textEnd && (isspace(*p) || *p == '\n'))
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
91 p++;
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
92 }
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 void skipLine()
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
95 {
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
96 while (p < textEnd && *p != '\n')
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
97 p++;
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
98 p++;
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
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
102 char[] makeString(char* begin, char* end)
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 return begin[0 .. end - begin];
c204b6a9e0ef Added new module dil.doc.Parser.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff changeset
105 }