Parser interface

From LMNLWiki

This is a proposal by John Cowan. It has some Javaisms in it, though the syntax is not Java.

Parsers in general:

interface Parser {
   String method getFeature(String name)
   method setFeature(String name, bool value)
   String method getProperty(String name)
   method setProperty(String name, Object value)
   method parse(File f)
   method parse(InputStream i)
   method parse(InputStream i, String baseURI)
   method parse(Reader r)
   method parse(Reader r, String baseURI)
   method parse(String sourceURI)
   method parse(String document, String baseURI)
   readonly integer property line
   readonly integer property column
}

Types of events returned by a pull parser:

enum EventType {
   DOCUMENT_OPEN
   DOCUMENT_CLOSE
   START_TAG_OPEN
   START_TAG_CLOSE
   END_TAG_OPEN
   END_TAG_CLOSE
   START_ANNOTATION_OPEN
   START_ANNOTATION_CLOSE
   END_ANNOTATION_OPEN
   END_ANNOTATION_CLOSE
   ATOM_OPEN
   ATOM_CLOSE
   TEXT
   COMMENT
   ERROR
}

Pull parsers (invoke get(), then inspect properties):

interface PullParser : Parser {
   EventType method get()
   # If the current event is TEXT:
      readonly char[] property characters
      readonly integer property start
      readonly integer property end
      readonly boolean property whitespace
   # Else if the current event is COMMENT:
      readonly String property content
   # Else if the current event is ERROR:
      readonly String property expected
      readonly String property found
      readonly String property message
   # Else if the current event is DOCUMENT_*:
      # then nothing
   # Else
      readonly String property namespaceName
      readonly String property localpart
      readonly String property id
   # End if
}

Push parsers (invoke document handler methods):

interface PushParser : Parser {
   ContentHandler property contentHandler
}

Content handlers (methods are called by push parsers):

interface ContentHandler {
   method documentOpen()
   method documentClose()
   method startTagOpen(String namespaceName, String localpart, String id)
   method startTagClose(String namespaceName, String localpart, String id)
   method endTagOpen(String namespaceName, String localpart, String id)
   method endTagClose(String namespaceName, String localpart, String id)
   method startAnnotationOpen(String namespaceName, String localpart, String id)
   method startAnnotationClose(String namespaceName, String localpart, String id)
   method endAnnotationOpen(String namespaceName, String localpart, String id)
   method endAnnotationClose(String namespaceName, String localpart, String id)
   method atomOpen(String namespaceName, String localpart, String id)
   method atomClose(String namespaceName, String localpart, String id)
   method text(char[] characters, int start, int end, bool whitespace)
   method comment(String content)
   method error(String expected, String found, String message)
}