solution/cw3/lexer.sc
changeset 869 81ee93b87258
parent 864 b5b1bc0a603b
equal deleted inserted replaced
868:8fb3b6d3be70 869:81ee93b87258
   200 
   200 
   201 // Language specific code
   201 // Language specific code
   202 val KEYWORD : Rexp = "while" | "if" | "then" | "else" | "do" | "for" | "to" | "true" | "false" | "read" | "write" | "skip" 
   202 val KEYWORD : Rexp = "while" | "if" | "then" | "else" | "do" | "for" | "to" | "true" | "false" | "read" | "write" | "skip" 
   203 val OP : Rexp = "+" | "-" | "*" | "%" | "/" | "==" | "!=" | ">" | "<" | ">=" | "<=" | ":=" | "&&" | "||"
   203 val OP : Rexp = "+" | "-" | "*" | "%" | "/" | "==" | "!=" | ">" | "<" | ">=" | "<=" | ":=" | "&&" | "||"
   204 val LET: Rexp = RANGE(('A' to 'Z').toSet ++ ('a' to 'z'))
   204 val LET: Rexp = RANGE(('A' to 'Z').toSet ++ ('a' to 'z'))
   205 val SYM : Rexp = LET | RANGE(Set('.', '_', '>', '<', '=', ';', ',', ':'))
   205 val SYM : Rexp = (LET | RANGE(Set('.', '_', '>', '<', '=', ';', ',', ':')))
   206 val PARENS : Rexp = "(" | "{" | ")" | "}"
   206 val PARENS : Rexp = "(" | "{" | ")" | "}"
   207 val SEMI : Rexp = ";"
   207 val SEMI : Rexp = ";"
   208 val WHITESPACE : Rexp = PLUS(" ") | "\n" | "\t"
   208 val WHITESPACE : Rexp = PLUS(" ") | "\n" | "\t" | "\r"
   209 val DIGIT : Rexp = RANGE(('0' to '9').toSet)
   209 val DIGIT : Rexp = RANGE(('0' to '9').toSet)
   210 val DIGIT1 : Rexp = RANGE(('1' to '9').toSet)
   210 val DIGIT1 : Rexp = RANGE(('1' to '9').toSet)
   211 val STRING : Rexp = "\"" ~ (SYM | " " | "\\n" | DIGIT).% ~ "\""
   211 val STRING : Rexp = "\"" ~ (SYM | " " | "\\n" | DIGIT).% ~ "\""
   212 val ID : Rexp = LET ~ (LET | "_" | DIGIT).%
   212 val ID : Rexp = LET ~ (LET | "_" | DIGIT).%
   213 val NUM : Rexp = "0" | (DIGIT1 ~ DIGIT.%)
   213 val NUM : Rexp = "0" | (DIGIT1 ~ DIGIT.%)
   214 val COMMENT : Rexp = "//" ~ (SYM | " " | DIGIT).% ~ "\n" 
   214 val EOL : Rexp = "\n" | "\r\n"
       
   215 val COMMENT : Rexp = "//" ~ (SYM | PARENS | " " | DIGIT).% ~ EOL 
   215 
   216 
   216 val WHILE_REGS = (("k" $ KEYWORD) | 
   217 val WHILE_REGS = (("k" $ KEYWORD) | 
   217                   ("o" $ OP) | 
   218                   ("o" $ OP) | 
   218                   ("str" $ STRING) |
   219                   ("str" $ STRING) |
   219                   ("p" $ PARENS) |
   220                   ("p" $ PARENS) |
   246 // Tokenise
   247 // Tokenise
   247 def tokenise(s: String) : List[Token] = 
   248 def tokenise(s: String) : List[Token] = 
   248   lexing_simp(WHILE_REGS, s).collect(token)
   249   lexing_simp(WHILE_REGS, s).collect(token)
   249 
   250 
   250 
   251 
       
   252 val fact = """
       
   253 write "Input n please";
       
   254 read n;
       
   255 write "The factors of n are";
       
   256 f := 2;
       
   257 while n != 1 do {
       
   258     while (n / f) * f == n do {
       
   259         write f;
       
   260         n := n / f
       
   261     };
       
   262     f := f + 1
       
   263 }
       
   264 """
       
   265 println(tokenise(fact))
       
   266