diff options
Diffstat (limited to 'src/library/scala/xml/xsd/ContentModel.scala')
-rw-r--r-- | src/library/scala/xml/xsd/ContentModel.scala | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/library/scala/xml/xsd/ContentModel.scala b/src/library/scala/xml/xsd/ContentModel.scala new file mode 100644 index 0000000000..11e513d26d --- /dev/null +++ b/src/library/scala/xml/xsd/ContentModel.scala @@ -0,0 +1,39 @@ +package scala.xml.xsd ; + +import scala.util.regexp.WordExp; +import scala.util.automata._; + +object ContentModel extends WordExp { + + type _labelT = ElemRef; + type _regexpT = RegExp; + + object Translator extends WordBerrySethi { + override val lang: ContentModel.this.type = ContentModel.this; + import lang._ ; + } + + case class ElemRef(name: String) extends Label { + override def toString() = name; + } + + def fromSchema(nodes:Seq[Node]): List[RegExp] = + nodes.foldLeft (Nil:List[RegExp]) { (list, n:Node) => fromSchema(n)::list }.reverse; + + def fromSchema(node:Node): RegExp = node.label match { + case "sequence" => Sequ(fromSchema(node.child):_*); + case "choice" => Alt(fromSchema(node.child):_*); + case "group" => Sequ(fromSchema(node.child):_*); + case "element" => + val name = node.attribute("name").toString(); + Letter(ElemRef(name)); // ouch, anonymous? references? + } +} + +sealed abstract class ContentModel ; + +case class ELEMENTS(r:ContentModel.RegExp) extends ContentModel ; + +case class MIXED(r:ContentModel.RegExp) extends ContentModel ; + +case object SimpleContent extends ContentModel ; |