1 .\" $Id: mdoc.3,v 1.44 2010/06/27 16:18:13 kristaps Exp $
3 .\" Copyright (c) 2009-2010 Kristaps Dzonsons <kristaps@bsd.lv>
5 .\" Permission to use, copy, modify, and distribute this software for any
6 .\" purpose with or without fee is hereby granted, provided that the above
7 .\" copyright notice and this permission notice appear in all copies.
9 .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 .Dd $Mdocdate: June 27 2010 $
29 .Nd mdoc macro compiler library
34 .Vt extern const char * const * mdoc_macronames;
35 .Vt extern const char * const * mdoc_argnames;
38 .Fa "struct regset *regs"
44 .Fn mdoc_endparse "struct mdoc *mdoc"
46 .Fn mdoc_free "struct mdoc *mdoc"
47 .Ft "const struct mdoc_meta *"
48 .Fn mdoc_meta "const struct mdoc *mdoc"
49 .Ft "const struct mdoc_node *"
50 .Fn mdoc_node "const struct mdoc *mdoc"
53 .Fa "struct mdoc *mdoc"
58 .Fn mdoc_reset "struct mdoc *mdoc"
62 library parses lines of
65 into an abstract syntax tree (AST).
67 In general, applications initiate a parsing sequence with
69 parse each line in a document with
71 close the parsing session with
73 operate over the syntax tree returned by
77 then free all allocated memory with
81 function may be used in order to reset the parser for another input
85 section for a simple example.
87 This section further defines the
92 available to programmers.
94 .Sx Abstract Syntax Tree
95 section documents the output tree.
101 may use the following types:
104 An opaque type defined in
106 Its values are only used privately within the library.
107 .It Vt struct mdoc_node
112 .Sx Abstract Syntax Tree
115 A function callback type defined in
119 Function descriptions follow:
122 Allocates a parsing structure.
129 arguments are defined in
131 Returns NULL on failure.
132 If non-NULL, the pointer must be freed with
135 Reset the parser for another parse routine.
138 behaves as if invoked for the first time.
139 If it returns 0, memory could not be allocated.
141 Free all resources of a parser.
142 The pointer is no longer valid after invocation.
144 Parse a nil-terminated line of input.
145 This line should not contain the trailing newline.
146 Returns 0 on failure, 1 on success.
149 is modified by this function.
151 Signals that the parse is complete.
154 is called subsequent to
156 the resulting tree is incomplete.
157 Returns 0 on failure, 1 on success.
159 Returns the first node of the parse.
164 return 0, the tree will be incomplete.
166 Returns the document's parsed meta-data.
167 If this information has not yet been supplied or
171 return 0, the data will be incomplete.
174 The following variables are also defined:
176 .It Va mdoc_macronames
177 An array of string-ified token names.
179 An array of string-ified token argument names.
181 .Ss Abstract Syntax Tree
184 functions produce an abstract syntax tree (AST) describing input in a
186 It may be reviewed at any time with
188 however, if called before
194 fail, it may be incomplete.
196 This AST is governed by the ontological
199 and derives its terminology accordingly.
201 elements described in
203 are described simply as
206 The AST is composed of
208 nodes with block, head, body, element, root and text types as declared
212 Each node also provides its parse point (the
217 fields), its position in the tree (the
223 fields) and some type-specific data.
225 The tree itself is arranged according to the following normal form,
226 where capitalised non-terminals represent nodes.
228 .Bl -tag -width "ELEMENTXX" -compact
232 \(<- BLOCK | ELEMENT | TEXT
234 \(<- HEAD [TEXT] (BODY [TEXT])+ [TAIL [TEXT]]
244 \(<- [[:printable:],0x1e]*
247 Of note are the TEXT nodes following the HEAD, BODY and TAIL nodes of
248 the BLOCK production: these refer to punctuation marks.
249 Furthermore, although a TEXT node will generally have a non-zero-length
250 string, in the specific case of
251 .Sq \&.Bd \-literal ,
252 an empty line will produce a zero-length string.
253 Multiple body parts are only found in invocations of
255 where a new body introduces a new phrase.
257 The following example reads lines from stdin and parses them, operating
258 on the finished parse tree with
260 This example does not error-check nor free memory upon failure.
261 .Bd -literal -offset indent
264 const struct mdoc_node *node;
269 bzero(®s, sizeof(struct regset));
271 mdoc = mdoc_alloc(®s, NULL, 0, NULL);
275 while ((len = getline(&buf, &alloc_len, stdin)) >= 0) {
276 if (len && buflen[len - 1] = '\en')
277 buf[len - 1] = '\e0';
278 if ( ! mdoc_parseln(mdoc, line, buf))
279 errx(1, "mdoc_parseln");
283 if ( ! mdoc_endparse(mdoc))
284 errx(1, "mdoc_endparse");
285 if (NULL == (node = mdoc_node(mdoc)))
286 errx(1, "mdoc_node");
294 in the source archive for a rigorous reference.
301 library was written by
302 .An Kristaps Dzonsons Aq kristaps@bsd.lv .