diff options
author | buraq <buraq@epfl.ch> | 2005-06-18 15:58:26 +0000 |
---|---|---|
committer | buraq <buraq@epfl.ch> | 2005-06-18 15:58:26 +0000 |
commit | dd9c59cc23aa4788996931654d4be465ae2649ce (patch) | |
tree | 1d9eb2be627d0a722ab9187ee4dbbb7b6708ad2f /sources | |
parent | 97b285c569217f2134a33670022418bf4b6689ec (diff) | |
download | scala-dd9c59cc23aa4788996931654d4be465ae2649ce.tar.gz scala-dd9c59cc23aa4788996931654d4be465ae2649ce.tar.bz2 scala-dd9c59cc23aa4788996931654d4be465ae2649ce.zip |
added the ElementValidator class
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scala/xml/dtd/ContentModel.scala | 32 | ||||
-rw-r--r-- | sources/scala/xml/dtd/ElementValidator.scala | 52 |
2 files changed, 55 insertions, 29 deletions
diff --git a/sources/scala/xml/dtd/ContentModel.scala b/sources/scala/xml/dtd/ContentModel.scala index 4875dad14b..9b9c86fe49 100644 --- a/sources/scala/xml/dtd/ContentModel.scala +++ b/sources/scala/xml/dtd/ContentModel.scala @@ -20,6 +20,9 @@ object ContentModel extends WordExp { override def toString() = "ElemName(\""+name+"\")"; } + def isMixed(cm: ContentModel) = cm.isInstanceOf[MIXED]; + def containsText(cm: ContentModel) = (cm == PCDATA) || isMixed(cm); + def parse(s: String): ContentModel = ContentModelParser.parse( s ); def getLabels(r: RegExp): scala.collection.Set[String] = { @@ -139,35 +142,6 @@ abstract class DFAContentModel extends ContentModel { } _dfa } - /* - def getIterator(ns:NodeSeq): Iterator[String]; - def runDFA(ns:NodeSeq): Boolean = { - if(null == _dfa) { - val nfa = ContentModel.Translator.automatonFrom(r, 1); - _dfa = new SubsetConstruction(nfa).determinize; - } - var q = 0; - val it = getIterator(ns); - Console.println("it empty from the start? "+(!it.hasNext)); - while( it.hasNext ) { - val e = it.next; - Console.println("next = "+e); - if(null == e) { - return _dfa.isFinal(q) - } else { - Console.println(" got :"+ElemName(e)); - Console.println("delta:" + _dfa.delta(q)); - - _dfa.delta(q).get(ElemName(e)).match { - case Some(p) => q = p; - case _ => throw ValidationException("element "+e+" not allowed here") - } - Console.println("q now " + q); - } - } - _dfa.isFinal(q) - } - */ } case class MIXED(r:ContentModel.RegExp) extends DFAContentModel { import ContentModel.{ Alt, Eps, RegExp }; diff --git a/sources/scala/xml/dtd/ElementValidator.scala b/sources/scala/xml/dtd/ElementValidator.scala new file mode 100644 index 0000000000..f301bebd87 --- /dev/null +++ b/sources/scala/xml/dtd/ElementValidator.scala @@ -0,0 +1,52 @@ +package scala.xml.dtd; + +import ContentModel.ElemName ; +import scala.util.automata._ ; + +class ElementValidator() extends Function1[Node,Boolean] { + + protected var _dfa: DetWordAutom[ElemName] = _; + + def setContentModel(cm:ContentModel) = cm match { + //case ANY => true ; + //case EMPTY => //@todo + //case PCDATA => + //case m@MIXED(r) => + case ELEMENTS( r ) => + val nfa = ContentModel.Translator.automatonFrom(r, 1); + _dfa = new SubsetConstruction(nfa).determinize; + } + + def getIterator(ns: Seq[Node]): Iterator[ElemName] = + ns . toList + . filter { x => x.namespace == null } + . map { x => ElemName(x.label) } + . elements; + /** @pre _dfa != null + */ + def runDFA(ns: Seq[Node]): Boolean = { + var q = 0; + val it = getIterator(ns); + //Console.println("it empty from the start? "+(!it.hasNext)); + while( it.hasNext ) { + val e = it.next; + // Console.println("next = "+e); + // Console.println(" got :"+ElemName(e)); + // Console.println("delta:" + _dfa.delta(q)); + + _dfa.delta(q).get(e).match { + case Some(p) => q = p; + case _ => throw ValidationException("element "+e+" not allowed here") + } + //Console.println("q now " + q); + } + _dfa.isFinal(q) + } + + def apply(n: Node): Boolean = { + var res = (null == _dfa) || runDFA(n.child); + // res = ... // @todo attributes + res + } + +} |