object Kind extends Enumeration { val KEYWORD = Value("keyword") val IDENT = Value("identifier") val LONG_IDENT = Value("long identifier") val TYPE_VAR = Value("type variable") val WORD = Value("word") val INT = Value("integer") val REAL = Value("real") val CHAR = Value("character") val STRING = Value("quoted string") val SPACE = Value("white space") val INFORMAL_COMMENT = Value("informal comment") val FORMAL_COMMENT = Value("formal comment") val CONTROL = Value("control symbol antiquotation") val ANTIQ = Value("antiquotation") val ANTIQ_START = Value("antiquotation: start") val ANTIQ_STOP = Value("antiquotation: stop") val ANTIQ_OTHER = Value("antiquotation: other") val ANTIQ_STRING = Value("antiquotation: quoted string") val ANTIQ_ALT_STRING = Value("antiquotation: back-quoted string") val ANTIQ_CARTOUCHE = Value("antiquotation: text cartouche") val ERROR = Value("bad input")
}
privateval gap = "\\" ~ blanks1 ~ "\\" ^^ { case x ~ y ~ z => x + y + z } privateval gap_start = "\\" ~ blanks ~ """\z""".r ^^ { case x ~ y ~ _ => x + y }
privateval escape =
one(character("\"\\abtnvfr".contains(_))) | "^" ~ one(character(c => '@' <= c && c <= '_')) ^^ { case x ~ y => x + y } |
repeated(character(Symbol.is_ascii_digit), 3, 3)
privateval str =
one(character(c => c != '"' && c != '\\' && ' ' <= c && c <= '~')) |
one(s =>
Symbol.is_open(s) || Symbol.is_close(s) || Symbol.is_symbolic(s) || Symbol.is_control(s)) | "\\" ~ escape ^^ { case x ~ y => x + y }
/* ML char -- without gaps */
privateval ml_char: Parser[Token] = "#\"" ~ str ~ "\"" ^^ { case x ~ y ~ z => Token(Kind.CHAR, x + y + z) }
privateval recover_ml_char: Parser[String] = "#\"" ~ opt(str) ^^ { case x ~ Some(y) => x + y case x ~ None => x }
ctxt match { case Scan.Finished => "\"" ~ ml_string_body ~ ("\"" | gap_start) ^^
{ case x ~ y ~ z => result(x + y + z, if (z == "\"") Scan.Finished else ML_String) } case ML_String =>
blanks ~ opt_term("\\" ~ ml_string_body ~ ("\"" | gap_start)) ^^
{ case x ~ Some(y ~ z ~ w) =>
result(x + y + z + w, if (w == "\"") Scan.Finished else ML_String) case x ~ None => result(x, ML_String) } case _ => failure("")
}
}
val long_ident =
rep1(alphanumeric ~ "." ^^ { case x ~ y => x + y }) ~
(alphanumeric | (symbolic | "=")) ^^
{ case x ~ y => Token(Kind.LONG_IDENT, x.mkString + y) }
val type_var = "'" ~ letdigs ^^ { case x ~ y => Token(Kind.TYPE_VAR, x + y) }
/* numerals */
val dec = many1(character(Symbol.is_ascii_digit)) val hex = many1(character(Symbol.is_ascii_hex)) val sign = opt("~") ^^ { case Some(x) => x case None => "" } val decint = sign ~ dec ^^ { case x ~ y => x + y } val exp = ("E" | "e") ~ decint ^^ { case x ~ y => x + y }
val word =
("0wx" ~ hex ^^ { case x ~ y => x + y } | "0w" ~ dec ^^ { case x ~ y => x + y }) ^^
(x => Token(Kind.WORD, x))
val int =
sign ~ ("0x" ~ hex ^^ { case x ~ y => x + y } | dec) ^^
{ case x ~ y => Token(Kind.INT, x + y) }
val rat =
decint ~ opt("/" ~ dec) ^^ { case x ~ None => x case x ~ Some(y ~ z) => x + y + z }
val real =
(decint ~ "." ~ dec ~ (opt(exp) ^^ { case Some(x) => x case None => "" }) ^^
{ case x ~ y ~ z ~ w => x + y + z + w } |
decint ~ exp ^^ { case x ~ y => x + y }) ^^ (x => Token(Kind.REAL, x))
/* main */
val space = blanks1 ^^ (x => Token(Kind.SPACE, x))
val keyword = literal(lexicon) ^^ (x => Token(Kind.KEYWORD, x))
val ml_control = control ^^ (x => Token(Kind.CONTROL, x)) val ml_antiq = "@" ~ rat ^^ { case x ~ y => Token(Kind.ANTIQ, x + y) } |
antiq ^^ (x => Token(Kind.ANTIQ, x))
val bad = one(_ => true) ^^ (x => Token(Kind.ERROR, x))
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.