blob: 82a8d1af2f6730fe11bceb932fff9eb8b35ab1c0 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
/* __ *\
** ________ ___ / / ___ Scala API **
** / __/ __// _ | / / / _ | (c) 2002-2011, LAMP/EPFL **
** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
** /____/\___/_/ |_/____/_/ | | **
** |/ **
\* */
package scala.xml
package dtd
/** 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) {
value = ""
it = (s).iterator
token = 1+END
next
nextToken
}
/** scans the next token */
final def nextToken() {
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) {
if (c == d) next else sys.error("expected '"+d+"' found '"+c+"' !");
}
final def accS(ds: Seq[Char]) { 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 sys.error("unexpected character:" + c)
}
final def name = {
val sb = new StringBuilder()
do { sb.append(c); next } while (isNameChar(c));
value = sb.toString()
NAME
}
}
|