summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2005-06-18 15:58:26 +0000
committerburaq <buraq@epfl.ch>2005-06-18 15:58:26 +0000
commitdd9c59cc23aa4788996931654d4be465ae2649ce (patch)
tree1d9eb2be627d0a722ab9187ee4dbbb7b6708ad2f /sources
parent97b285c569217f2134a33670022418bf4b6689ec (diff)
downloadscala-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.scala32
-rw-r--r--sources/scala/xml/dtd/ElementValidator.scala52
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
+ }
+
+}