Skip to content

Commit f0b6dc9

Browse files
buraqadriaanm
buraq
authored andcommitted
better name
1 parent 5f59bdd commit f0b6dc9

File tree

1 file changed

+144
-0
lines changed

1 file changed

+144
-0
lines changed
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package scala.xml.dtd ;
2+
3+
/** Parser for regexps (content models in DTD element declarations) */
4+
5+
object ContentModelParser extends Scanner { // a bit too permissive concerning #PCDATA
6+
import ContentModel._ ;
7+
8+
/** parses the argument to a regexp */
9+
def parse(s:String): ContentModel = { initScanner( s ); contentspec }
10+
11+
// zzz parser methods zzz
12+
def accept( tok:int ) = {
13+
if( token != tok ) {
14+
if(( tok == STAR )&&( token == END )) // common mistake
15+
error("in DTDs, \n"+
16+
"mixed content models must be like (#PCDATA|Name|Name|...)*");
17+
else
18+
error("expected "+token2string(tok)+
19+
", got unexpected token:"+token2string(token));
20+
}
21+
nextToken
22+
}
23+
24+
// s [ '+' | '*' | '?' ]
25+
def maybeSuffix(s:RegExp) = token match {
26+
case STAR => nextToken; Star( s )
27+
case PLUS => nextToken; Sequ( s, Star( s ))
28+
case OPT => nextToken; Alt( Eps, s )
29+
case _ => s
30+
}
31+
32+
33+
// contentspec ::= EMPTY | ANY | (#PCDATA) | "(#PCDATA|"regexp)
34+
35+
def contentspec: ContentModel = token match {
36+
37+
case NAME => value match {
38+
case "ANY" => ANY
39+
case "EMPTY" => EMPTY
40+
case _ => error("expected ANY, EMPTY or '(' instead of " + value );
41+
}
42+
case LPAREN =>
43+
44+
nextToken;
45+
sOpt;
46+
if( token != TOKEN_PCDATA )
47+
ELEMENTS(regexp);
48+
else {
49+
nextToken;
50+
token match {
51+
case RPAREN =>
52+
PCDATA
53+
case CHOICE =>
54+
val res = MIXED(choiceRest(Eps));
55+
sOpt;
56+
accept( RPAREN );
57+
accept( STAR );
58+
res
59+
case _ =>
60+
error("unexpected token:" + token2string(token) );
61+
}
62+
}
63+
64+
case _ =>
65+
error("unexpected token:" + token2string(token) );
66+
}
67+
// sopt ::= S?
68+
def sOpt = if( token == S ) nextToken;
69+
70+
// (' S? mixed ::= '#PCDATA' S? ')'
71+
// | '#PCDATA' (S? '|' S? atom)* S? ')*'
72+
/*
73+
def mixed = {
74+
accept( TOKEN_PCDATA );
75+
sOpt;
76+
if( token == RPAREN )
77+
PCDATA_
78+
else {
79+
val t = choiceRest( PCDATA_ );
80+
if( !isMixed( t ) )
81+
error("mixed content models must be like (#PCDATA.|.|.|.)*");
82+
accept( RPAREN );
83+
// lax: (workaround for buggy Java XML parser in JDK1.4.2)
84+
if( token == STAR ) accept( STAR );
85+
// strict:
86+
// accept( STAR );
87+
Star( t )
88+
}
89+
}
90+
*/
91+
// '(' S? regexp ::= cp S? [seqRest|choiceRest] ')' [ '+' | '*' | '?' ]
92+
def regexp:RegExp = {
93+
//Console.println("regexp, token = "+token2string(token));
94+
val p = particle;
95+
sOpt;
96+
maybeSuffix( token match {
97+
case RPAREN => nextToken; p
98+
case CHOICE => val q = choiceRest( p );accept( RPAREN ); q
99+
case COMMA => val q = seqRest( p ); accept( RPAREN ); q
100+
})
101+
}
102+
103+
104+
// seqRest ::= (',' S? cp S?)+
105+
def seqRest( p:RegExp ) = {
106+
var k = List( p );
107+
while( token == COMMA ) {
108+
nextToken;
109+
sOpt;
110+
k = particle::k;
111+
sOpt;
112+
}
113+
Sequ( k.reverse:_* )
114+
}
115+
116+
// choiceRest ::= ('|' S? cp S?)+
117+
def choiceRest( p:RegExp ) = {
118+
var k = List( p );
119+
while( token == CHOICE ) {
120+
nextToken;
121+
sOpt;
122+
k = particle::k;
123+
sOpt;
124+
}
125+
Alt( k.reverse:_* )
126+
}
127+
128+
// particle ::= '(' S? regexp
129+
// | name [ '+' | '*' | '?' ]
130+
def particle = {
131+
//Console.println("particle, token="+token2string(token));
132+
token match {
133+
case LPAREN => nextToken; sOpt; regexp;
134+
case NAME => val a = Letter(ElemName(value)); nextToken; maybeSuffix( a )
135+
case _ => error("expected '(' or Name, got:"+token2string( token ));
136+
}
137+
}
138+
139+
// atom ::= name
140+
def atom = token match {
141+
case NAME => val a = Letter(ElemName(value)); nextToken; a
142+
case _ => error("expected Name, got:"+token2string( token ));
143+
}
144+
}

0 commit comments

Comments
 (0)