Advertisement
Guest User

Untitled

a guest
Aug 26th, 2013
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.08 KB | None | 0 0
  1. enum Pattern {
  2. // matches and consumes
  3. Literal(~str),
  4. Range(char, char),
  5. Set(~[char]),
  6. Rep(int, ~Pattern),
  7. Seq(~[Pattern]),
  8. Or(~[~Pattern]),
  9. Diff(~Pattern, ~Pattern),
  10. Match(~Pattern, ~fn(&Pattern) -> int),
  11.  
  12. // matches but doesn't consume
  13. And(~Pattern),
  14.  
  15. // consumes but doesn't match
  16. Chars(int),
  17.  
  18. // controls visibility
  19. All(~Pattern),
  20. Select(int, ~Pattern),
  21. Var(~str, ~Pattern),
  22. Group(~Pattern),
  23. Pos,
  24. Constant(~str),
  25. Fold(~Pattern, ~fn(&Pattern, &Pattern) -> Pattern)
  26. }
  27.  
  28. struct Token<'self> {
  29. children: ~[Token<'self>],
  30. tok: &'self str,
  31. start: uint,
  32. end: uint
  33. }
  34.  
  35. fn parse<'self>(pat: Pattern, text: &'self str, offset: uint) -> Option<Token> {
  36. match pat {
  37. Literal(s) => {
  38. let slc: &'self str = text.slice(offset, s.len());
  39. if slc == s {
  40. Some(Token {children: ~[], tok: slc, start: offset, end: offset + s.len()})
  41. } else {
  42. None
  43. }
  44. }
  45. _ => None
  46. }
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement