--- /dev/null
+<HTML
+><HEAD
+><TITLE
+>The DTD classes</TITLE
+><META
+NAME="GENERATOR"
+CONTENT="Modular DocBook HTML Stylesheet Version 1.46"><LINK
+REL="HOME"
+TITLE="The PXP user's guide"
+HREF="index.html"><LINK
+REL="UP"
+TITLE="Configuring and calling the parser"
+HREF="c1567.html"><LINK
+REL="PREVIOUS"
+TITLE="Resolvers and sources"
+HREF="x1629.html"><LINK
+REL="NEXT"
+TITLE="Invoking the parser"
+HREF="x1818.html"><LINK
+REL="STYLESHEET"
+TYPE="text/css"
+HREF="markup.css"></HEAD
+><BODY
+CLASS="SECT1"
+BGCOLOR="#FFFFFF"
+TEXT="#000000"
+LINK="#0000FF"
+VLINK="#840084"
+ALINK="#0000FF"
+><DIV
+CLASS="NAVHEADER"
+><TABLE
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TH
+COLSPAN="3"
+ALIGN="center"
+>The PXP user's guide</TH
+></TR
+><TR
+><TD
+WIDTH="10%"
+ALIGN="left"
+VALIGN="bottom"
+><A
+HREF="x1629.html"
+>Prev</A
+></TD
+><TD
+WIDTH="80%"
+ALIGN="center"
+VALIGN="bottom"
+>Chapter 4. Configuring and calling the parser</TD
+><TD
+WIDTH="10%"
+ALIGN="right"
+VALIGN="bottom"
+><A
+HREF="x1818.html"
+>Next</A
+></TD
+></TR
+></TABLE
+><HR
+ALIGN="LEFT"
+WIDTH="100%"></DIV
+><DIV
+CLASS="SECT1"
+><H1
+CLASS="SECT1"
+><A
+NAME="AEN1812"
+>4.3. The DTD classes</A
+></H1
+><P
+><I
+CLASS="EMPHASIS"
+>Sorry, not yet
+written. Perhaps the interface definition of Pxp_dtd expresses the same:</I
+></P
+><P
+><PRE
+CLASS="PROGRAMLISTING"
+> (**********************************************************************)
+(* *)
+(* Pxp_dtd: *)
+(* Object model of document type declarations *)
+(* *)
+(**********************************************************************)
+
+(* ======================================================================
+ * OVERVIEW
+ *
+ * class dtd ............... represents the whole DTD, including element
+ * declarations, entity declarations, notation
+ * declarations, and processing instructions
+ * class dtd_element ....... represents an element declaration consisting
+ * of a content model and an attribute list
+ * declaration
+ * class dtd_notation ...... represents a notation declaration
+ * class proc_instruction .. represents a processing instruction
+ * ======================================================================
+ *
+ *)
+
+
+class dtd :
+ (* Creation:
+ * new dtd
+ * creates a new, empty DTD object without any declaration, without a root
+ * element, without an ID.
+ *)
+ Pxp_types.collect_warnings ->
+ Pxp_types.rep_encoding ->
+ object
+ method root : string option
+ (* get the name of the root element if present *)
+
+ method set_root : string -> unit
+ (* set the name of the root element. This method can be invoked
+ * only once
+ *)
+
+ method id : Pxp_types.dtd_id option
+ (* get the identifier for this DTD *)
+
+ method set_id : Pxp_types.dtd_id -> unit
+ (* set the identifier. This method can be invoked only once *)
+
+ method encoding : Pxp_types.rep_encoding
+ (* returns the encoding used for character representation *)
+
+
+ method allow_arbitrary : unit
+ (* After this method has been invoked, the object changes its behaviour:
+ * - elements and notations that have not been added may be used in an
+ * arbitrary way; the methods "element" and "notation" indicate this
+ * by raising Undeclared instead of Validation_error.
+ *)
+
+ method disallow_arbitrary : unit
+
+ method arbitrary_allowed : bool
+ (* Returns whether arbitrary contents are allowed or not. *)
+
+ method standalone_declaration : bool
+ (* Whether there is a 'standalone' declaration or not. Strictly
+ * speaking, this declaration is not part of the DTD, but it is
+ * included here because of practical reasons.
+ * If not set, this property defaults to 'false'.
+ *)
+
+ method set_standalone_declaration : bool -> unit
+ (* Sets the 'standalone' declaration. *)
+
+
+ method add_element : dtd_element -> unit
+ (* add the given element declaration to this DTD. Raises Not_found
+ * if there is already an element declaration with the same name.
+ *)
+
+ method add_gen_entity : Pxp_entity.entity -> bool -> unit
+ (* add_gen_entity e extdecl:
+ * add the entity 'e' as general entity to this DTD (general entities
+ * are those represented by &name;). If there is already a declaration
+ * with the same name, the second definition is ignored; as exception from
+ * this rule, entities with names "lt", "gt", "amp", "quot", and "apos"
+ * may only be redeclared with a definition that is equivalent to the
+ * standard definition; otherwise a Validation_error is raised.
+ *
+ * 'extdecl': 'true' indicates that the entity declaration occurs in
+ * an external entity. (Used for the standalone check.)
+ *)
+
+ method add_par_entity : Pxp_entity.entity -> unit
+ (* add the given entity as parameter entity to this DTD (parameter
+ * entities are those represented by %name;). If there is already a
+ * declaration with the same name, the second definition is ignored.
+ *)
+
+ method add_notation : dtd_notation -> unit
+ (* add the given notation to this DTD. If there is already a declaration
+ * with the same name, a Validation_error is raised.
+ *)
+
+ method add_pinstr : proc_instruction -> unit
+ (* add the given processing instruction to this DTD. *)
+
+ method element : string -> dtd_element
+ (* looks up the element declaration with the given name. Raises
+ * Validation_error if the element cannot be found. (If "allow_arbitrary"
+ * has been invoked before, Unrestricted is raised instead.)
+ *)
+
+ method element_names : string list
+ (* returns the list of the names of all element declarations. *)
+
+ method gen_entity : string -> (Pxp_entity.entity * bool)
+ (* let e, extdecl = obj # gen_entity n:
+ * looks up the general entity 'e' with the name 'n'. Raises
+ * WF_error if the entity cannot be found.
+ * 'extdecl': indicates whether the entity declaration occured in an
+ * external entity.
+ *)
+
+ method gen_entity_names : string list
+ (* returns the list of all general entity names *)
+
+ method par_entity : string -> Pxp_entity.entity
+ (* looks up the parameter entity with the given name. Raises
+ * WF_error if the entity cannot be found.
+ *)
+
+ method par_entity_names : string list
+ (* returns the list of all parameter entity names *)
+
+ method notation : string -> dtd_notation
+ (* looks up the notation declaration with the given name. Raises
+ * Validation_error if the notation cannot be found. (If "allow_arbitrary"
+ * has been invoked before, Unrestricted is raised instead.)
+ *)
+
+ method notation_names : string list
+ (* Returns the list of the names of all added notations *)
+
+ method pinstr : string -> proc_instruction list
+ (* looks up all processing instructions with the given target.
+ * The "target" is the identifier following "<?".
+ * Note: It is not possible to find out the exact position of the
+ * processing instruction.
+ *)
+
+ method pinstr_names : string list
+ (* Returns the list of the names (targets) of all added pinstrs *)
+
+ method validate : unit
+ (* ensures that the DTD is valid. This method is optimized such that
+ * actual validation is only performed if DTD has changed.
+ * If the DTD is invalid, mostly a Validation_error is raised,
+ * but other exceptions are possible, too.
+ *)
+
+ method only_deterministic_models : unit
+ (* Succeeds if all regexp content models are deterministic.
+ * Otherwise Validation_error.
+ *)
+
+ method write : Pxp_types.output_stream -> Pxp_types.encoding -> bool -> unit
+ (* write_compact_as_latin1 os enc doctype:
+ * Writes the DTD as 'enc'-encoded string to 'os'. If 'doctype', a
+ * DTD like <!DOCTYPE root [ ... ]> is written. If 'not doctype',
+ * only the declarations are written (the material within the
+ * square brackets).
+ *)
+
+ method write_compact_as_latin1 : Pxp_types.output_stream -> bool -> unit
+ (* DEPRECATED METHOD; included only to keep compatibility with
+ * older versions of the parser
+ *)
+
+
+ (*----------------------------------------*)
+ method invalidate : unit
+ (* INTERNAL METHOD *)
+ method warner : Pxp_types.collect_warnings
+ (* INTERNAL METHOD *)
+ end
+
+
+
+(* ---------------------------------------------------------------------- *)
+
+and dtd_element : dtd -> string ->
+ (* Creation:
+ * new dtd_element init_dtd init_name:
+ * creates a new dtd_element object for init_dtd with init_name.
+ * The strings are represented in the same encoding as init_dtd.
+ *)
+ object
+
+ method name : string
+ (* returns the name of the declared element *)
+
+ method externally_declared : bool
+ (* returns whether the element declaration occurs in an external
+ * entity.
+ *)
+
+ method content_model : Pxp_types.content_model_type
+ (* get the content model of this element declaration, or Unspecified *)
+
+ method content_dfa : Pxp_dfa.dfa_definition option
+ (* return the DFA of the content model if there is a DFA, or None.
+ * A DFA exists only for regexp style content models which are
+ * deterministic.
+ *)
+
+ method set_cm_and_extdecl : Pxp_types.content_model_type -> bool -> unit
+ (* set_cm_and_extdecl cm extdecl:
+ * set the content model to 'cm'. Once the content model is not
+ * Unspecified, it cannot be set to a different value again.
+ * Furthermore, it is set whether the element occurs in an external
+ * entity ('extdecl').
+ *)
+
+ method encoding : Pxp_types.rep_encoding
+ (* Return the encoding of the strings *)
+
+ method allow_arbitrary : unit
+ (* After this method has been invoked, the object changes its behaviour:
+ * - attributes that have not been added may be used in an
+ * arbitrary way; the method "attribute" indicates this
+ * by raising Undeclared instead of Validation_error.
+ *)
+
+ method disallow_arbitrary : unit
+
+ method arbitrary_allowed : bool
+ (* Returns whether arbitrary attributes are allowed or not. *)
+
+ method attribute : string ->
+ Pxp_types.att_type * Pxp_types.att_default
+ (* get the type and default value of a declared attribute, or raise
+ * Validation_error if the attribute does not exist.
+ * If 'arbitrary_allowed', the exception Undeclared is raised instead
+ * of Validation_error.
+ *)
+
+ method attribute_violates_standalone_declaration :
+ string -> string option -> bool
+ (* attribute_violates_standalone_declaration name v:
+ * Checks whether the attribute 'name' violates the "standalone"
+ * declaration if it has value 'v'.
+ * The method returns true if:
+ * - The attribute declaration occurs in an external entity,
+ * and if one of the two conditions holds:
+ * - v = None, and there is a default for the attribute value
+ * - v = Some s, and the type of the attribute is not CDATA,
+ * and s changes if normalized according to the rules of the
+ * attribute type.
+ *
+ * The method raises Validation_error if the attribute does not exist.
+ * If 'arbitrary_allowed', the exception Undeclared is raised instead
+ * of Validation_error.
+ *)
+
+ method attribute_names : string list
+ (* get the list of all declared attributes *)
+
+ method names_of_required_attributes : string list
+ (* get the list of all attributes that are specified as required
+ * attributes
+ *)
+
+ method id_attribute_name : string option
+ (* Returns the name of the attribute with type ID, or None. *)
+
+ method idref_attribute_names : string list
+ (* Returns the names of the attributes with type IDREF or IDREFS. *)
+
+ method add_attribute : string ->
+ Pxp_types.att_type ->
+ Pxp_types.att_default ->
+ bool ->
+ unit
+ (* add_attribute name type default extdecl:
+ * add an attribute declaration for an attribute with the given name,
+ * type, and default value. If there is more than one declaration for
+ * an attribute name, the first declaration counts; the other declarations
+ * are ignored.
+ * 'extdecl': if true, the attribute declaration occurs in an external
+ * entity. This property is used to check the "standalone" attribute.
+ *)
+
+ method validate : unit
+ (* checks whether this element declaration (i.e. the content model and
+ * all attribute declarations) is valid for the associated DTD.
+ * Raises mostly Validation_error if the validation fails.
+ *)
+
+ method write : Pxp_types.output_stream -> Pxp_types.encoding -> unit
+ (* write_compact_as_latin1 os enc:
+ * Writes the <!ELEMENT ... > declaration to 'os' as 'enc'-encoded string.
+ *)
+
+ method write_compact_as_latin1 : Pxp_types.output_stream -> unit
+ (* DEPRECATED METHOD; included only to keep compatibility with
+ * older versions of the parser
+ *)
+ end
+
+(* ---------------------------------------------------------------------- *)
+
+and dtd_notation : string -> Pxp_types.ext_id -> Pxp_types.rep_encoding ->
+ (* Creation:
+ * new dtd_notation a_name an_external_ID init_encoding
+ * creates a new dtd_notation object with the given name and the given
+ * external ID.
+ *)
+ object
+ method name : string
+ method ext_id : Pxp_types.ext_id
+ method encoding : Pxp_types.rep_encoding
+
+ method write : Pxp_types.output_stream -> Pxp_types.encoding -> unit
+ (* write_compact_as_latin1 os enc:
+ * Writes the <!NOTATION ... > declaration to 'os' as 'enc'-encoded
+ * string.
+ *)
+
+ method write_compact_as_latin1 : Pxp_types.output_stream -> unit
+ (* DEPRECATED METHOD; included only to keep compatibility with
+ * older versions of the parser
+ *)
+
+ end
+
+(* ---------------------------------------------------------------------- *)
+
+and proc_instruction : string -> string -> Pxp_types.rep_encoding ->
+ (* Creation:
+ * new proc_instruction a_target a_value
+ * creates a new proc_instruction object with the given target string and
+ * the given value string.
+ * Note: A processing instruction is written as <?target value?>.
+ *)
+ object
+ method target : string
+ method value : string
+ method encoding : Pxp_types.rep_encoding
+
+ method write : Pxp_types.output_stream -> Pxp_types.encoding -> unit
+ (* write os enc:
+ * Writes the <?...?> PI to 'os' as 'enc'-encoded string.
+ *)
+
+ method write_compact_as_latin1 : Pxp_types.output_stream -> unit
+ (* DEPRECATED METHOD; included only to keep compatibility with
+ * older versions of the parser
+ *)
+
+ method parse_pxp_option : (string * string * (string * string) list)
+ (* Parses a PI containing a PXP option. Such PIs are formed like:
+ * <?target option-name option-att="value" option-att="value" ... ?>
+ * The method returns a triple
+ * (target, option-name, [option-att, value; ...])
+ * or raises Error.
+ *)
+
+ end
+
+;; </PRE
+></P
+></DIV
+><DIV
+CLASS="NAVFOOTER"
+><HR
+ALIGN="LEFT"
+WIDTH="100%"><TABLE
+WIDTH="100%"
+BORDER="0"
+CELLPADDING="0"
+CELLSPACING="0"
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+><A
+HREF="x1629.html"
+>Prev</A
+></TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="index.html"
+>Home</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+><A
+HREF="x1818.html"
+>Next</A
+></TD
+></TR
+><TR
+><TD
+WIDTH="33%"
+ALIGN="left"
+VALIGN="top"
+>Resolvers and sources</TD
+><TD
+WIDTH="34%"
+ALIGN="center"
+VALIGN="top"
+><A
+HREF="c1567.html"
+>Up</A
+></TD
+><TD
+WIDTH="33%"
+ALIGN="right"
+VALIGN="top"
+>Invoking the parser</TD
+></TR
+></TABLE
+></DIV
+></BODY
+></HTML
+>
\ No newline at end of file