48 |
48 |
49 def atom(s: String, pred: Elem => Boolean): Parser[String] = |
49 def atom(s: String, pred: Elem => Boolean): Parser[String] = |
50 token(s, pred) ^^ (_.content) |
50 token(s, pred) ^^ (_.content) |
51 |
51 |
52 def keyword(name: String): Parser[String] = |
52 def keyword(name: String): Parser[String] = |
53 atom(Outer_Lex.Token_Kind.KEYWORD.toString + " \"" + name + "\"", |
53 atom(Token.Kind.KEYWORD.toString + " \"" + name + "\"", |
54 tok => tok.kind == Outer_Lex.Token_Kind.KEYWORD && tok.content == name) |
54 tok => tok.kind == Token.Kind.KEYWORD && tok.content == name) |
55 |
55 |
56 def name: Parser[String] = atom("name declaration", _.is_name) |
56 def name: Parser[String] = atom("name declaration", _.is_name) |
57 def xname: Parser[String] = atom("name reference", _.is_xname) |
57 def xname: Parser[String] = atom("name reference", _.is_xname) |
58 def text: Parser[String] = atom("text", _.is_text) |
58 def text: Parser[String] = atom("text", _.is_text) |
59 def ML_source: Parser[String] = atom("ML source", _.is_text) |
59 def ML_source: Parser[String] = atom("ML source", _.is_text) |
60 def doc_source: Parser[String] = atom("document source", _.is_text) |
60 def doc_source: Parser[String] = atom("document source", _.is_text) |
61 def path: Parser[String] = atom("file name/path specification", _.is_name) |
61 def path: Parser[String] = atom("file name/path specification", _.is_name) |
62 |
62 |
63 private def tag_name: Parser[String] = |
63 private def tag_name: Parser[String] = |
64 atom("tag name", tok => |
64 atom("tag name", tok => |
65 tok.kind == Outer_Lex.Token_Kind.IDENT || |
65 tok.kind == Token.Kind.IDENT || |
66 tok.kind == Outer_Lex.Token_Kind.STRING) |
66 tok.kind == Token.Kind.STRING) |
67 |
67 |
68 def tags: Parser[List[String]] = rep(keyword("%") ~> tag_name) |
68 def tags: Parser[List[String]] = rep(keyword("%") ~> tag_name) |
69 |
69 |
70 |
70 |
71 /* wrappers */ |
71 /* wrappers */ |
72 |
72 |
73 def parse[T](p: Parser[T], in: Outer_Lex.Reader): ParseResult[T] = p(in) |
73 def parse[T](p: Parser[T], in: Token.Reader): ParseResult[T] = p(in) |
74 def parse_all[T](p: Parser[T], in: Outer_Lex.Reader): ParseResult[T] = parse(phrase(p), in) |
74 def parse_all[T](p: Parser[T], in: Token.Reader): ParseResult[T] = parse(phrase(p), in) |
75 } |
75 } |
76 } |
76 } |
77 |
77 |