Github user stevedlawrence commented on a diff in the pull request:

    https://github.com/apache/incubator-daffodil/pull/5#discussion_r151132760
  
    --- Diff: 
daffodil-core/src/main/scala/edu/illinois/ncsa/daffodil/dsom/package.scala ---
    @@ -0,0 +1,100 @@
    +package edu.illinois.ncsa.daffodil
    +
    +/**
    + * DSOM - DFDL Schema Object Model
    + *
    + * ==Overview==
    + * DSOM is the abstract syntax "tree" of a DFDL schema. It is not actually 
a tree, it is
    + * a graph, as there are back-pointers, and shared objects.
    + *
    + * A schema is made up of [[SchemaComponent]] objects. A [[SchemaSet]] is 
a collection of
    + * [[Schema]]. A schema is a collection of [[SchemaDocument]] that have a 
common
    + * namespace. The [[SchemaSet]] is the
    + * ultimate root of all the objects in a compilation unit. The [[Term]] 
class.
    + *
    + * Many [[SchemaComponent]] carry DFDL annotations; hence, 
[[AnnotatedSchemaComponent]]
    + * is a key base trait.
    + *
    + * ==UML Class Diagram==
    + *
    + * See the
    + * 
[[https://cwiki.apache.org/confluence/display/DAFFODIL/DFDL+Schema+Object+Model+%28DSOM%29+with+UML
    + * Daffodil Wiki]]
    + * for class diagrams.
    + *
    + * ==Terminology==
    + *
    + * Parsing - in this description we are talking about the Daffodil Schema 
Compiler.
    + * So when we refer to "parsing" the XML, we are referring
    + * to the recursive descent walk of the DFDL schema, with that schema 
represented as Scala's
    + * `scala.xml.Node` objects. Strictly speaking, the string text in files 
of the DFDL
    + * schema's XML is already parsed into Scala's `scala.xml.Node` objects, 
but
    + * it is the walk through that structure constructing the DSOM tree/graph 
that we
    + * refer to as "parsing" the DFDL schema.
    + *
    + * ==Principles of Operation==
    + *
    + * === Constructing the DSOM Graph===
    + *
    + * The DSOM object graph must be constructed by looking at only the XML 
without
    + * examining any DFDL annotations. The DSOM structure is required in order 
to
    + * implement DFDL's scoping rules for finding annotations including both
    + * properties (like dfdl:byteOrder) and statements (like dfdl:assert); 
hence,
    + * one must have the DSOM graph before one can begin
    + * accessing DFDL annotations or you end up in cycles/stack-overflows.
    + *
    + * This requires a careful consideration of class/trait members and 
methods that
    + * are used when constructing the DSOM graph, and those used after the DSOM
    + * graph has been created, in order to compile it into the runtime data 
structures.
    + *
    + * There are a few exceptions to the above. The dfdl:hiddenGroupRef 
attribute is one such. It
    + * must be local to the [[Sequence]] object, and has implications for the 
parsing
    + * of the XML as it implies there should be no children of that 
xs:sequence.
    + * Since it is not scoped, the DSOM graph is not needed in order to access 
it.
    + * Only the local [[Sequence]] object and it's [[DFDLSequence]] annotation 
object.
    + * The [[AnnotatedSchemaComponent]] trait provides methods for this 
local-only
    + * property lookup.
    + *
    + * The DSOM object graph is also needed in order to issue good diagnostic
    + * messages from the compiler; hence, Daffodil validates the DFDL schema 
before
    + * parsing it into the DSOM graph. Careful consideration must be given if a
    + * SchemaDefinitionError (SDE) is issued while constructing the DSOM graph.
    + *
    + * If you run into stack-overflows while the DSOM graph is being 
constructed, the
    + * above is a common cause of them, as the SDE diagnostic messaging uses 
DSOM graph
    + * information to construct context information about the error for 
inclusion
    + * in the messages. If the DSOM graph is still being constructed at that 
time, then
    + * this can be circular.
    + *
    + * ===Using the DSOM Graph===
    + *
    + * DSOM supports Daffodil schema compilation by way of the
    + * `OOLAG` pattern which
    + * is an object oriented way of using the
    + * [[https://en.wikipedia.org/wiki/Attribute_grammar attribute grammars]] 
compiler technique.
    + *
    + * Many attributes (in the attribute grammar sense, nothing to do with XML 
attributes)
    + * are simply Scala lazy val definitions, but some are declared as OOLAG
    + * attributes (using 
`edu.illinois.ncsa.daffodil.oolag.OOLAG.OOLAGHost.LV`) which
    + * provides for gathering of multiple diagnostic messages 
(`SchemaDefinitionError`)
    + * before abandoning compilation.
    + *
    + * DFDL schema compilation largely occurs by evaluating lazy val members 
of DSOM
    + * objects. These include the members of the grammar traits
    + * (@see [[edu.illinois.ncsa.daffodil.grammar]] package), which are mixed
    + * in to the appropriate DSOM traits/classes.
    + *
    + * ===FAQ===
    + * Q: Why invent this? Why not use XSOM, or the Apache XML Schema library?
    + *
    + * A:We had trouble with other XML-schema libraries for
    + * lack of adequate support for annotations, non-native attributes, and 
schema
    + * documents as first class objects. So DSOM is specific to Daffodil 
Basically these
    + * libraries are more about implementing XML Schema and validation, and 
not so
    + * much about a complex language built on the annotations of the schema. 
DSOM
    + * is really mostly about the annotations.
    + *
    + */
    +package object dsom {
    +  // This package object is just for scaladoc
    +}
    --- End diff --
    
    These are very helpful!  We'll definitely want to continue adding 
package.scala files to help new developers onboard.


---

Reply via email to