Advertisement
tudzic

lexer

Oct 11th, 2014
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.67 KB | None | 0 0
  1. reserved ++= List( "bool", "break", "class", "continue", "do", "downto", "else", "extends", "float",
  2. "for", "if", "integer", "new", "repeat", "string", "then", "to", "until", "while", "return", "true",
  3. "false", "void", "null", "self", "final", "abstract", "self")
  4.  
  5. delimiters ++= List(":", ";", "{", "}", "[", "]", "(", ")",".", ",", "&&",
  6. "+", "*", "\\",":=", "<", "<=", "<>", "!", "^", "-", "/", "%", "==",
  7. ">", ">=", "||", "::", "=")
  8.  
  9. def processType(name: String) = if (name == "true" || name=="false") BooleanLit(name) else Keyword(name)
  10.  
  11. override def processIdent(name: String) =
  12. if (reserved contains name) processType(name) else Identifier(name)
  13.  
  14. override def token: Parser[Token] = {
  15. // Adapted from StdLexical
  16. (
  17. regex("[0-9]+\\.[0-9]*((E|e)(\\+|\\-)[0-9]+)?|[0-9]+(E|e)(\\+|\\-)[0-9]+".r) ^^{FloatLit(_)}
  18. |regex("[0-9]+".r) ^^ { IntLit(_) }
  19. |regex("[a-zA-Z_][a-zA-Z0-9_]*".r) ^^ {processIdent(_)}
  20. |regex("\"([^\\n\\\\\"]|(\\\\n)|(\\\\b)|(\\\\f)|(\\\\r)|(\\\\t)|(\\\\\")|(\\\\\\\\))*\"".r) ^^{StringLit2(_)}
  21. |regex("\"([^\\n\\\\\"]|(\\\\n)|(\\\\b)|(\\\\f)|(\\\\r)|(\\\\t)|(\\\\\")|(\\\\\\\\))*(\\n|$)".r) ^^{UncloseString(_)}
  22. |EofCh ^^^ EOF
  23. |delim
  24. )
  25. }
  26.  
  27. override def whitespace: Parser[Any] = rep(
  28. whitespaceChar
  29. |'#' ~ rep(chrExcept(EofCh,'\n'))
  30. | '(' ~ '*' ~ comment
  31. | '(' ~ '*' ~> failure("unclosed comment"))
  32.  
  33. override protected def comment: Parser[Any] = (
  34. '*' ~ ')' ^^ { case _ => ' ' }
  35. | chrExcept(EofCh) ~ comment)
  36.  
  37. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement