diff --git a/build.sbt b/build.sbt index 32b5d1424..8d9863a97 100644 --- a/build.sbt +++ b/build.sbt @@ -93,9 +93,15 @@ lazy val xml = crossProject(JSPlatform, JVMPlatform) exclude[MissingClassProblem]("scala.xml.dtd.impl.PointedHedgeExp$Point$"), exclude[MissingClassProblem]("scala.xml.dtd.impl.PointedHedgeExp$TopIter"), exclude[MissingClassProblem]("scala.xml.dtd.impl.PointedHedgeExp$Node"), + exclude[MissingClassProblem]("scala.xml.dtd.Scanner"), + exclude[MissingClassProblem]("scala.xml.dtd.ContentModelParser$"), + exclude[MissingClassProblem]("scala.xml.dtd.ContentModelParser"), + exclude[MissingClassProblem]("scala.xml.factory.Binder"), + exclude[MissingClassProblem]("scala.xml.parsing.ValidatingMarkupHandler"), exclude[MissingClassProblem]("scala.xml.persistent.CachedFileStorage"), exclude[MissingClassProblem]("scala.xml.persistent.Index"), exclude[MissingClassProblem]("scala.xml.persistent.SetStorage"), + exclude[DirectMissingMethodProblem]("scala.xml.dtd.ContentModel.parse"), exclude[DirectMissingMethodProblem]("scala.xml.Elem.this"), exclude[DirectMissingMethodProblem]("scala.xml.Elem.apply"), exclude[DirectMissingMethodProblem]("scala.xml.Elem.processXml"), diff --git a/shared/src/main/scala/scala/xml/dtd/ContentModel.scala b/shared/src/main/scala/scala/xml/dtd/ContentModel.scala index 4ef9fec55..444e93e8a 100644 --- a/shared/src/main/scala/scala/xml/dtd/ContentModel.scala +++ b/shared/src/main/scala/scala/xml/dtd/ContentModel.scala @@ -39,7 +39,6 @@ object ContentModel extends WordExp { def isMixed(cm: ContentModel) = cond(cm) { case _: MIXED => true } def containsText(cm: ContentModel) = (cm == PCDATA) || isMixed(cm) - def parse(s: String): ContentModel = ContentModelParser.parse(s) def getLabels(r: RegExp): Set[String] = { def traverse(r: RegExp): Set[String] = r match { // !!! check for match translation problem diff --git a/shared/src/main/scala/scala/xml/dtd/ContentModelParser.scala b/shared/src/main/scala/scala/xml/dtd/ContentModelParser.scala deleted file mode 100644 index c69dca9f2..000000000 --- a/shared/src/main/scala/scala/xml/dtd/ContentModelParser.scala +++ /dev/null @@ -1,137 +0,0 @@ -/* __ *\ -** ________ ___ / / ___ Scala API ** -** / __/ __// _ | / / / _ | (c) 2002-2019, LAMP/EPFL ** -** __\ \/ /__/ __ |/ /__/ __ | http://www.scala-lang.org/ ** -** /____/\___/_/ |_/____/_/ | | ** -** |/ ** -\* */ - -package scala -package xml -package dtd - -/** Parser for regexps (content models in DTD element declarations) */ - -object ContentModelParser extends Scanner { // a bit too permissive concerning #PCDATA - import ContentModel._ - - /** parses the argument to a regexp */ - def parse(s: String): ContentModel = { initScanner(s); contentspec } - - def accept(tok: Int) = { - if (token != tok) { - if ((tok == STAR) && (token == END)) // common mistake - scala.sys.error("in DTDs, \n" + - "mixed content models must be like (#PCDATA|Name|Name|...)*") - else - scala.sys.error("expected " + token2string(tok) + - ", got unexpected token:" + token2string(token)) - } - nextToken() - } - - // s [ '+' | '*' | '?' ] - def maybeSuffix(s: RegExp) = token match { - case STAR => - nextToken(); Star(s) - case PLUS => - nextToken(); Sequ(s, Star(s)) - case OPT => - nextToken(); Alt(Eps, s) - case _ => s - } - - // contentspec ::= EMPTY | ANY | (#PCDATA) | "(#PCDATA|"regexp) - - def contentspec: ContentModel = token match { - - case NAME => value match { - case "ANY" => ANY - case "EMPTY" => EMPTY - case _ => scala.sys.error("expected ANY, EMPTY or '(' instead of " + value) - } - case LPAREN => - - nextToken() - sOpt() - if (token != TOKEN_PCDATA) - ELEMENTS(regexp) - else { - nextToken() - token match { - case RPAREN => - PCDATA - case CHOICE => - val res = MIXED(choiceRest(Eps)) - sOpt() - accept(RPAREN) - accept(STAR) - res - case _ => - scala.sys.error("unexpected token:" + token2string(token)) - } - } - - case _ => - scala.sys.error("unexpected token:" + token2string(token)) - } - // sopt ::= S? - def sOpt() = if (token == S) nextToken() - - // (' S? mixed ::= '#PCDATA' S? ')' - // | '#PCDATA' (S? '|' S? atom)* S? ')*' - - // '(' S? regexp ::= cp S? [seqRest|choiceRest] ')' [ '+' | '*' | '?' ] - def regexp: RegExp = { - val p = particle - sOpt() - maybeSuffix(token match { - case RPAREN => - nextToken(); p - case CHOICE => - val q = choiceRest(p); accept(RPAREN); q - case COMMA => val q = seqRest(p); accept(RPAREN); q - }) - } - - // seqRest ::= (',' S? cp S?)+ - def seqRest(p: RegExp) = { - var k = List(p) - while (token == COMMA) { - nextToken() - sOpt() - k = particle :: k - sOpt() - } - Sequ(k.reverse: _*) - } - - // choiceRest ::= ('|' S? cp S?)+ - def choiceRest(p: RegExp) = { - var k = List(p) - while (token == CHOICE) { - nextToken() - sOpt() - k = particle :: k - sOpt() - } - Alt(k.reverse: _*) - } - - // particle ::= '(' S? regexp - // | name [ '+' | '*' | '?' ] - def particle = token match { - case LPAREN => - nextToken(); sOpt(); regexp - case NAME => - val a = Letter(ElemName(value)); nextToken(); maybeSuffix(a) - case _ => scala.sys.error("expected '(' or Name, got:" + token2string(token)) - } - - // atom ::= name - def atom = token match { - case NAME => - val a = Letter(ElemName(value)); nextToken(); a - case _ => scala.sys.error("expected Name, got:" + token2string(token)) - } -} diff --git a/shared/src/main/scala/scala/xml/dtd/Scanner.scala b/shared/src/main/scala/scala/xml/dtd/Scanner.scala deleted file mode 100644 index cb042d5a9..000000000 --- a/shared/src/main/scala/scala/xml/dtd/Scanner.scala +++ /dev/null @@ -1,89 +0,0 @@ -/* __ *\ -** ________ ___ / / ___ Scala API ** -** / __/ __// _ | / / / _ | (c) 2002-2019, LAMP/EPFL ** -** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** -** /____/\___/_/ |_/____/_/ | | ** -** |/ ** -\* */ - -package scala -package xml -package dtd - -import scala.collection.Seq - -/** - * Scanner for regexps (content models in DTD element declarations) - * todo: cleanup - */ -class Scanner extends Tokens with parsing.TokenTests { - - final val ENDCH = '\u0000' - - var token: Int = END - var value: String = _ - - private var it: Iterator[Char] = null - private var c: Char = 'z' - - /** initializes the scanner on input s */ - final def initScanner(s: String): Unit = { - value = "" - it = (s).iterator - token = 1 + END - next() - nextToken() - } - - /** scans the next token */ - final def nextToken(): Unit = { - if (token != END) token = readToken - } - - // todo: see XML specification... probably isLetter,isDigit is fine - final def isIdentChar = (('a' <= c && c <= 'z') - || ('A' <= c && c <= 'Z')) - - final def next() = if (it.hasNext) c = it.next() else c = ENDCH - - final def acc(d: Char): Unit = { - if (c == d) next() else scala.sys.error("expected '" + d + "' found '" + c + "' !") - } - - final def accS(ds: Seq[Char]): Unit = { ds foreach acc } - - final def readToken: Int = - if (isSpace(c)) { - while (isSpace(c)) c = it.next() - S - } else c match { - case '(' => - next(); LPAREN - case ')' => - next(); RPAREN - case ',' => - next(); COMMA - case '*' => - next(); STAR - case '+' => - next(); PLUS - case '?' => - next(); OPT - case '|' => - next(); CHOICE - case '#' => - next(); accS("PCDATA"); TOKEN_PCDATA - case ENDCH => END - case _ => - if (isNameStart(c)) name; // NAME - else scala.sys.error("unexpected character:" + c) - } - - final def name = { - val sb = new StringBuilder() - do { sb.append(c); next() } while (isNameChar(c)) - value = sb.toString() - NAME - } - -} diff --git a/shared/src/main/scala/scala/xml/factory/Binder.scala b/shared/src/main/scala/scala/xml/factory/Binder.scala deleted file mode 100755 index 3c1b595ac..000000000 --- a/shared/src/main/scala/scala/xml/factory/Binder.scala +++ /dev/null @@ -1,59 +0,0 @@ -/* __ *\ -** ________ ___ / / ___ Scala API ** -** / __/ __// _ | / / / _ | (c) 2002-2019, LAMP/EPFL ** -** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** -** /____/\___/_/ |_/____/_/ | | ** -** |/ ** -\* */ - -package scala -package xml -package factory - -import parsing.ValidatingMarkupHandler - -/** - * @author Burak Emir - */ -abstract class Binder(val preserveWS: Boolean) extends ValidatingMarkupHandler { - - var result: NodeBuffer = new NodeBuffer() - - def reportSyntaxError(pos: Int, str: String) = {} - - final def procInstr(pos: Int, target: String, txt: String) = - ProcInstr(target, txt) - - final def comment(pos: Int, txt: String) = - Comment(txt) - - final def entityRef(pos: Int, n: String) = - EntityRef(n) - - final def text(pos: Int, txt: String) = - Text(txt) - - final def traverse(n: Node): Unit = n match { - case x: ProcInstr => - result &+ procInstr(0, x.target, x.text) - case x: Comment => - result &+ comment(0, x.text) - case x: Text => - result &+ text(0, x.data) - case x: EntityRef => - result &+ entityRef(0, x.entityName) - case x: Elem => - elemStart(0, x.prefix, x.label, x.attributes, x.scope) - val old = result - result = new NodeBuffer() - for (m <- x.child) traverse(m) - result = old &+ elem(0, x.prefix, x.label, x.attributes, x.scope, x.minimizeEmpty, NodeSeq.fromSeq(result)).toList - elemEnd(0, x.prefix, x.label) - } - - final def validate(n: Node): Node = { - this.rootLabel = n.label - traverse(n) - result(0) - } -} diff --git a/shared/src/main/scala/scala/xml/parsing/ValidatingMarkupHandler.scala b/shared/src/main/scala/scala/xml/parsing/ValidatingMarkupHandler.scala deleted file mode 100644 index a1821bd95..000000000 --- a/shared/src/main/scala/scala/xml/parsing/ValidatingMarkupHandler.scala +++ /dev/null @@ -1,102 +0,0 @@ -/* __ *\ -** ________ ___ / / ___ Scala API ** -** / __/ __// _ | / / / _ | (c) 2002-2019, LAMP/EPFL ** -** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ ** -** /____/\___/_/ |_/____/_/ | | ** -** |/ ** -\* */ - -package scala -package xml -package parsing - -import scala.xml.dtd._ - -abstract class ValidatingMarkupHandler extends MarkupHandler { - - var rootLabel: String = _ - var qStack: List[Int] = Nil - var qCurrent: Int = -1 - - var declStack: List[ElemDecl] = Nil - var declCurrent: ElemDecl = null - - final override val isValidating = true - - override def endDTD(n: String) = { - rootLabel = n - } - override def elemStart(pos: Int, pre: String, label: String, attrs: MetaData, scope: NamespaceBinding): Unit = { - - def advanceDFA(dm: DFAContentModel) = { - val trans = dm.dfa.delta(qCurrent) - // println("advanceDFA(dm): " + dm) - // println("advanceDFA(trans): " + trans) - trans.get(ContentModel.ElemName(label)) match { - case Some(qNew) => qCurrent = qNew - case _ => reportValidationError(pos, "DTD says, wrong element, expected one of " + trans.keys) - } - } - // advance in current automaton - // println("[qCurrent = " + qCurrent + " visiting " + label + "]") - - if (qCurrent == -1) { // root - // println(" checking root") - if (label != rootLabel) - reportValidationError(pos, "this element should be " + rootLabel) - } else { - // println(" checking node") - declCurrent.contentModel match { - case ANY => - case EMPTY => - reportValidationError(pos, "DTD says, no elems, no text allowed here") - case PCDATA => - reportValidationError(pos, "DTD says, no elements allowed here") - case m@MIXED(r) => - advanceDFA(m) - case e@ELEMENTS(r) => - advanceDFA(e) - } - } - // push state, decl - qStack = qCurrent :: qStack - declStack = declCurrent :: declStack - - declCurrent = lookupElemDecl(label) - qCurrent = 0 - // println(" done now") - } - - override def elemEnd(pos: Int, pre: String, label: String): Unit = { - // println(" elemEnd") - qCurrent = qStack.head - qStack = qStack.tail - declCurrent = declStack.head - declStack = declStack.tail - // println(" qCurrent now" + qCurrent) - // println(" declCurrent now" + declCurrent) - } - - final override def elemDecl(name: String, cmstr: String): Unit = { - decls = ElemDecl(name, ContentModel.parse(cmstr)) :: decls - } - - final override def attListDecl(name: String, attList: List[AttrDecl]): Unit = { - decls = AttListDecl(name, attList) :: decls - } - - final override def unparsedEntityDecl(name: String, extID: ExternalID, notat: String): Unit = { - decls = UnparsedEntityDecl(name, extID, notat) :: decls - } - - final override def notationDecl(notat: String, extID: ExternalID): Unit = { - decls = NotationDecl(notat, extID) :: decls - } - - final override def peReference(name: String): Unit = { - decls = PEReference(name) :: decls - } - - /** report a syntax error */ - def reportValidationError(pos: Int, str: String): Unit -}