\r
int line = 1;\r
int column;\r
+ int savedLineNumber = 1;\r
+ int savedLinePosition;\r
bool nextIncrementLine;\r
- string prefixName;\r
\r
public RncTokenizer (TextReader source)\r
{\r
}\r
\r
public int Line {\r
- get { return line; }\r
+ get { return savedLineNumber; }\r
}\r
\r
public int Column {\r
- get { return column; }\r
+ get { return savedLinePosition; }\r
}\r
\r
// jay interface implementation\r
\r
public bool advance ()\r
{\r
- if (prefixName != null)\r
- throw new RelaxngException ("Invalid prefix was found.");\r
tokenValue = null;\r
- currentToken = ParseToken ();\r
+ currentToken = ParseToken (false);\r
+ savedLineNumber = line;\r
+ savedLinePosition = column;\r
return currentToken != Token.EOF;\r
}\r
\r
return ret;\r
ret = source.Read ();\r
switch (ret) {\r
- case '\\':\r
- return ret;\r
case 'x':\r
int tmp;\r
int xcount = 0;\r
peekChar = 0;\r
return ret;\r
}\r
- throw new RelaxngException ("Invalidly escaped token.");\r
+ peekString = new string ((char) ret, 1);\r
+ return '\\';\r
}\r
\r
private int PeekChar ()\r
default:\r
if (c < 0)\r
throw new RelaxngException ("Unterminated quoted literal.");\r
+ if (XmlChar.IsInvalid (c))\r
+ throw new RelaxngException ("Invalid character in literal.");\r
AppendNameChar (c, ref index);\r
break;\r
}\r
default:\r
if (c < 0)\r
throw new RelaxngException ("Unterminated triple-quoted literal.");\r
+ if (XmlChar.IsInvalid (c))\r
+ throw new RelaxngException ("Invalid character in literal.");\r
AppendNameChar (c, ref index);\r
break;\r
}\r
return new string (nameBuffer, 0, index);\r
}\r
\r
- private string ReadOneToken ()\r
+ private string ReadOneName ()\r
{\r
int index = 0;\r
bool loop = true;\r
+ int c = PeekChar ();\r
+ if (!XmlChar.IsFirstNameChar (c) || !XmlChar.IsNCNameChar (c))\r
+ throw new RelaxngException (String.Format ("Invalid NCName start character: {0}", c));\r
do {\r
- int c = PeekChar ();\r
+ c = PeekChar ();\r
switch (c) {\r
case -1:\r
case ' ':\r
loop = false;\r
break;\r
default:\r
- if (!IsNCNameChar (c)) {\r
- if (c == ':') {\r
- if (prefixName != null)\r
- throw new RelaxngException ("Invalid colon was found.");\r
- prefixName = new string (nameBuffer, 0, index);\r
- }\r
+ if (!XmlChar.IsNCNameChar (c)) {\r
loop = false;\r
break;\r
}\r
return s;\r
}\r
\r
- private bool IsNCNameChar (int c)\r
- {\r
- switch (c) {\r
- case '=':\r
- case ':':\r
- case ',':\r
- case '{':\r
- case '}':\r
- case '(':\r
- case ')':\r
- case '[':\r
- case ']':\r
- case '&':\r
- case '|':\r
- case '?':\r
- case '*':\r
- case '\\':\r
- case '+':\r
-// case '-':\r
- case '>':\r
- case '#':\r
- case '\'':\r
- case '\"':\r
- return false;\r
- }\r
- return true;\r
- }\r
-\r
- private int ParseToken ()\r
+ private int ParseToken (bool backslashed)\r
{\r
SkipWhitespaces ();\r
int c = ReadChar ();\r
return Token.EOF;\r
case '=':\r
return Token.Equal;\r
- case ':':\r
- // return CName\r
- if (prefixName == null)\r
- throw new RelaxngException ("Invalid character ':' was found.");\r
- if (PeekChar () == '*') {\r
- ReadChar ();\r
- tokenValue = prefixName;\r
- prefixName = null;\r
- return Token.NsName;\r
- }\r
- tokenValue = prefixName + ":" + ReadOneToken ();\r
- prefixName = null;\r
- return Token.CName;\r
case '~':\r
return Token.Tilde;\r
case ',':\r
// See also ':' for NsName\r
return Token.Asterisk;\r
case '\\':\r
- return Token.BackSlash;\r
+ if (backslashed)\r
+ return Token.BackSlash;\r
+ return ParseToken (true);\r
case '+':\r
return Token.Plus;\r
case '-':\r
// throw new RelaxngException ("Invalid character after '#'.");\r
tokenValue = ReadLine ();\r
// return Token.Documentation;\r
- return ParseToken ();\r
+ return ParseToken (false);\r
case '\'':\r
case '\"':\r
if (PeekChar () != c)\r
tokenValue = name;\r
return Token.LiteralSegment;\r
default:\r
+ if (!XmlChar.IsNCNameChar (c))\r
+ throw new RelaxngException ("Invalid NCName character.");\r
peekChar = c;\r
- name = ReadOneToken ();\r
- if (prefixName != null)\r
- return ParseToken ();\r
+ name = ReadOneName ();\r
+ if (PeekChar () == ':') {\r
+ ReadChar ();\r
+ if (PeekChar () == '*') {\r
+ ReadChar ();\r
+ tokenValue = name;\r
+ return Token.NsName;\r
+ }\r
+ tokenValue = name + ":" + ReadOneName ();\r
+ return Token.CName;\r
+\r
+ }\r
tokenValue = name;\r
+ if (backslashed)\r
+ return Token.NCName;\r
switch (name) {\r
case "attribute":\r
isElement = false;\r
case "token":\r
return Token.KeywordToken;\r
default:\r
- return Token.NCNameButKeyword;\r
+ return Token.NCName;\r
}\r
}\r
}\r