182 lines
5.7 KiB
Standard ML
182 lines
5.7 KiB
Standard ML
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
signature ErrorString =
|
|
sig
|
|
val errorChar2String : UniChar.Char -> string
|
|
val errorData2String : UniChar.Data -> string
|
|
val errorVector2String : UniChar.Vector -> string
|
|
|
|
val quoteErrorChar0 : UniChar.Char -> string
|
|
val quoteErrorChar : UniChar.Char -> string
|
|
val quoteErrorData : UniChar.Data -> string
|
|
val quoteErrorString : string -> string
|
|
val quoteErrorVector : UniChar.Vector -> string
|
|
|
|
val Position2String : ErrorData.Position -> string
|
|
|
|
val Expected2String : ErrorData.Expected -> string
|
|
val Found2String : ErrorData.Found -> string
|
|
|
|
val Item2String : ErrorData.Item -> string
|
|
val AnItem2String : ErrorData.Item -> string
|
|
|
|
val Location2String : ErrorData.Location -> string
|
|
val InLocation2String : ErrorData.Location -> string
|
|
|
|
val EntityClass2String : ErrorData.EntityClass -> string
|
|
end
|
|
|
|
structure ErrorString : ErrorString =
|
|
struct
|
|
open
|
|
ErrorData UniChar UtilString
|
|
|
|
|
|
fun errorChar2String c =
|
|
case c
|
|
of 0wx9 => "\\t"
|
|
| 0wxA => "\\n"
|
|
| _ => if (c>=0wx20 andalso c<0wx7F) orelse (c>0wx9F andalso c<0wx100) then String.implode [Char2char c]
|
|
else "U+"^UtilString.toUpperString
|
|
(StringCvt.padLeft #"0" 4 (Chars.toString c))
|
|
|
|
fun errorData2String cs =
|
|
String.concat (map errorChar2String cs)
|
|
fun errorVector2String vec =
|
|
errorData2String (Vector.foldr (op ::) nil vec)
|
|
|
|
|
|
(* val QUOTE = "'" *)
|
|
|
|
fun quoteErrorChar0 c = ("'"^(errorChar2String c)^"'")
|
|
fun quoteErrorChar c = if c=0wx0 then "entity end" else "'"^(errorChar2String c)^"'"
|
|
fun quoteErrorData cs = "'"^(errorData2String cs)^"'"
|
|
fun quoteErrorString s = "'"^s^"'"
|
|
fun quoteErrorVector v = "'"^(errorVector2String v)^"'"
|
|
|
|
fun Position2String (fname,l,c) =
|
|
if fname="" then ""
|
|
else String.concat ["[",fname,":",Int2String l,".",Int2String c,"]"]
|
|
|
|
fun ExpItem2String exp =
|
|
case exp
|
|
of EXP_CHAR c => quoteErrorChar c
|
|
| EXP_DATA cs => quoteErrorData cs
|
|
| EXP_STRING s => s
|
|
|
|
fun Expected2String exp =
|
|
case exp
|
|
of nil => "nothing"
|
|
| [one] => ExpItem2String one
|
|
| _ => let val l=List.length exp
|
|
in List2xString ("",", ","") ExpItem2String (List.take (exp,l-1))
|
|
^" or "^ExpItem2String (List.last exp)
|
|
end
|
|
fun Found2String fnd =
|
|
case fnd
|
|
of [0wx0] => "entity end"
|
|
| cs => quoteErrorData cs
|
|
|
|
fun Location2String loc =
|
|
case loc
|
|
of LOC_NONE => "nothing"
|
|
| LOC_AFTER_DTD => "document instance"
|
|
| LOC_ATT_DECL => "attribute list declaration"
|
|
| LOC_ATT_DEFAULT pos => "default value declared at "^Position2String pos
|
|
| LOC_ATT_VALUE => "attribute value"
|
|
| LOC_CDATA => "CDATA section"
|
|
| LOC_CHOICE => "choice list"
|
|
| LOC_COMMENT => "comment"
|
|
| LOC_CONTENT => "content"
|
|
| LOC_DECL => "declaration"
|
|
| LOC_DOC_DECL => "document type declaration"
|
|
| LOC_ELEM_DECL => "element type declaration"
|
|
| LOC_ENCODING => "encoding name"
|
|
| LOC_ENT_DECL => "entity declaration"
|
|
| LOC_ENT_VALUE => "entity value"
|
|
| LOC_EPILOG => "epilog"
|
|
| LOC_ETAG => "end-tag"
|
|
| LOC_IGNORED => "ignored section"
|
|
| LOC_INCLUDED => "included section"
|
|
| LOC_INT_DECL => "declaration in the internal subset"
|
|
| LOC_INT_SUBSET => "internal subset"
|
|
| LOC_LITERAL => "literal"
|
|
| LOC_MIXED => "Mixed list"
|
|
| LOC_NOT_DECL => "notation declaration"
|
|
| LOC_OUT_COND => "outside a conditional section"
|
|
| LOC_PROLOG => "prolog"
|
|
| LOC_PROC => "processing instruction"
|
|
| LOC_PUB_LIT => "public identifier"
|
|
| LOC_SEQ => "sequence list"
|
|
| LOC_STAG => "start-tag"
|
|
| LOC_SUBSET => "declaration subset"
|
|
| LOC_SYS_LIT => "system identifier"
|
|
| LOC_TEXT_DECL => "text declaration"
|
|
| LOC_VERSION => "version number"
|
|
| LOC_XML_DECL => "XML declaration"
|
|
fun InLocation2String loc =
|
|
case loc
|
|
of LOC_NONE => ""
|
|
| LOC_AFTER_DTD => "after the DTD"
|
|
| LOC_CONTENT => "in content"
|
|
| LOC_ATT_DEFAULT pos => "in default value declared at "^Position2String pos
|
|
| LOC_DOC_DECL => "in the document type declaration"
|
|
| LOC_EPILOG => "after the root element"
|
|
| LOC_INT_SUBSET => "in the internal subset"
|
|
| LOC_OUT_COND => "outside a conditional section"
|
|
| LOC_PROLOG => "in prolog"
|
|
| LOC_SUBSET => "in the declaration subset"
|
|
| LOC_XML_DECL => "in the XML declaration"
|
|
| _ => "in "^prependAnA (Location2String loc)
|
|
|
|
fun EntityClass2String ent =
|
|
case ent
|
|
of ENT_GENERAL => "general"
|
|
| ENT_PARAMETER => "parameter"
|
|
| ENT_UNPARSED => "unparsed"
|
|
| ENT_EXTERNAL => "external"
|
|
|
|
fun Item2String item =
|
|
case item
|
|
of IT_ATT_NAME => "attribute name"
|
|
| IT_CDATA => "CDATA section"
|
|
| IT_CHAR c => "character "^quoteErrorChar c
|
|
| IT_CHAR_REF => "character reference"
|
|
| IT_COND => "conditional section"
|
|
| IT_DATA cs => if null cs then "character data" else quoteErrorData cs
|
|
| IT_DECL => "declaration"
|
|
| IT_DTD => "document type declaration"
|
|
| IT_ELEM => "element type"
|
|
| IT_ENT_NAME => "entity name"
|
|
| IT_ETAG => "end-tag"
|
|
| IT_GEN_ENT => "general entity"
|
|
| IT_ID_NAME => "ID name"
|
|
| IT_LANG_ID => "language identifier"
|
|
| IT_NAME => "name"
|
|
| IT_NMTOKEN => "name token"
|
|
| IT_NOT_NAME => "notation name"
|
|
| IT_NOTATION => "notation"
|
|
| IT_PAR_ENT => "parameter entity"
|
|
| IT_PAR_REF => "parameter entity reference"
|
|
| IT_REF => "reference"
|
|
| IT_STAG => "start-tag"
|
|
| IT_TARGET => "target name"
|
|
|
|
fun AnItem2String item =
|
|
case item
|
|
of IT_CHAR c => Item2String item
|
|
| IT_DATA cs => Item2String item
|
|
| _ => prependAnA (Item2String item)
|
|
end
|
|
|