summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2004-07-05 15:58:22 +0000
committerburaq <buraq@epfl.ch>2004-07-05 15:58:22 +0000
commit379107dc6e0d9cc64cbc4163745a542a15129d34 (patch)
treea85779cedfe4267f3981c49d4441de6e58547d4d /sources
parenteb5957859c6339e8fb16d9a8251fe86d3312b4e4 (diff)
downloadscala-379107dc6e0d9cc64cbc4163745a542a15129d34.tar.gz
scala-379107dc6e0d9cc64cbc4163745a542a15129d34.tar.bz2
scala-379107dc6e0d9cc64cbc4163745a542a15129d34.zip
here it is
Diffstat (limited to 'sources')
-rw-r--r--sources/scala/xml/dtd/ContentModel.scala87
1 files changed, 87 insertions, 0 deletions
diff --git a/sources/scala/xml/dtd/ContentModel.scala b/sources/scala/xml/dtd/ContentModel.scala
new file mode 100644
index 0000000000..0659c68541
--- /dev/null
+++ b/sources/scala/xml/dtd/ContentModel.scala
@@ -0,0 +1,87 @@
+package scala.xml.dtd ;
+
+abstract class ElemNames extends scala.util.regexp.Alphabet;
+case class ElemName(name: String) extends ElemNames {
+ override def toString() = "ElemName(\""+name+"\")";
+}
+
+object ContentModel extends scala.util.regexp.WordExp[ElemNames] {
+ type regexp = RegExp;
+
+ case object PCDATA_ extends RegExp {
+ override def toString() = "PCDATA_";
+ }
+
+ case object ANY_ extends RegExp {
+ override def toString() = "ANY_";
+ }
+
+ def parse(s: String): RegExp = Parser.parse( s );
+
+ def isMixed(alt:Alt):boolean = {
+ val it = alt.rs.elements;
+ it.next == PCDATA_ && {
+ while( it.hasNext && it.next.isInstanceOf[Letter] ) {} ;
+ !it.hasNext
+ }
+ }
+
+ def getLabels(r:RegExp): scala.collection.Set[String] = {
+ val s = new scala.collection.mutable.HashSet[String]();
+ def traverse1(xs: Seq[RegExp]): Unit = {
+ val it = xs.elements;
+ while( it.hasNext )
+ traverse( it.next );
+ }
+ def traverse(r: RegExp): Unit = {
+ r match {
+ case Letter(ElemName( name )) => s += name;
+ case Star( x @ _ ) => traverse( x ); // bug if x@_*
+ case Sequ( xs @ _* ) => traverse1(xs);
+ case Alt( xs @ _* ) => traverse1(xs);
+ }
+ }
+ traverse( r );
+ return s
+ }
+
+ def toString(r: RegExp):String = {
+ val sb = new StringBuffer();
+ toString(r, sb);
+ sb.toString();
+ }
+
+ /* precond: rs.length > 1 */
+ private def toString(rs: Seq[RegExp], sb: StringBuffer):Unit = {
+ val it = rs.elements;
+ sb.append('(');
+ toString(it.next, sb);
+ for(val z <- it) {
+ sb.append( ',' );
+ toString( z, sb );
+ }
+ sb.append( ')' );
+ }
+
+ def toString(r: RegExp, sb:StringBuffer):Unit = {
+ r match {
+ case PCDATA_ => sb.append("PCDATA_");
+ case ANY_ => sb.append("ANY_");
+ case Eps => sb.append("Eps");
+ case Sequ(rs @ _*) =>
+ sb.append("Sequ");
+ toString(rs, sb);
+ case Alt(rs @ _*) =>
+ sb.append("Alt");
+ toString(rs, sb);
+ case Star(r:RegExp) =>
+ sb.append("Star(");
+ toString(r, sb);
+ sb.append(')');
+ case Letter(ElemName(name)) =>
+ sb.append("Letter(ElemName(\"");
+ sb.append(name);
+ sb.append("\"))");
+ }
+ }
+}