progs/token2.scala
changeset 392 2d0a59127694
parent 388 66f66f1710ed
equal deleted inserted replaced
391:f352cb238c32 392:2d0a59127694
   223 
   223 
   224 lexing_simp(OPT("ab"), "ab")
   224 lexing_simp(OPT("ab"), "ab")
   225 
   225 
   226 // Lexing Rules for a Small While Language
   226 // Lexing Rules for a Small While Language
   227 
   227 
   228 val SYM = CRANGE("abcdefghijklmnopqrstuvwxyz")
   228 val SYM = CRANGE("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
   229 val DIGIT = CRANGE("0123456789")
   229 val DIGIT = CRANGE("0123456789")
   230 val ID = SYM ~ (SYM | DIGIT).% 
   230 val ID = SYM ~ (SYM | DIGIT).% 
   231 val NUM = PLUS(DIGIT)
   231 val NUM = PLUS(DIGIT)
   232 val KEYWORD : Rexp = "skip" | "while" | "do" | "if" | "then" | "else" | "read" | "write" | "true" | "false"
   232 val KEYWORD : Rexp = "skip" | "while" | "do" | "if" | "then" | "else" | "read" | "write" | "true" | "false"
   233 val SEMI: Rexp = ";"
   233 val SEMI: Rexp = ";"
   250                   ("b" $ (BEGIN | END)) | 
   250                   ("b" $ (BEGIN | END)) | 
   251                   ("w" $ WHITESPACE)).%
   251                   ("w" $ WHITESPACE)).%
   252 
   252 
   253 // filters out all white spaces
   253 // filters out all white spaces
   254 def tokenise(r: Rexp, s: String) = 
   254 def tokenise(r: Rexp, s: String) = 
   255   env(lexing_simp(r, s)).filterNot { (s) => s._1 == "w"}.mkString("\n")
   255   env(lexing_simp(r, s)).filterNot { (s) => s._1 == "w"}
   256 
   256 
   257 //   Testing
   257 //   Testing
   258 //============
   258 //============
   259 
   259 
   260 def time[T](code: => T) = {
   260 def time[T](code: => T) = {
   291 
   291 
   292 
   292 
   293 // Big Test
   293 // Big Test
   294 //==========
   294 //==========
   295 
   295 
       
   296 def escape(raw: String): String = {
       
   297   import scala.reflect.runtime.universe._
       
   298   Literal(Constant(raw)).toString
       
   299 }
       
   300 
   296 val prog2 = """
   301 val prog2 = """
   297 write "fib";
   302 write "Fib";
   298 read n;
   303 read n;
   299 minus1 := 0;
   304 minus1 := 0;
   300 minus2 := 1;
   305 minus2 := 1;
   301 while n > 0 do {
   306 while n > 0 do {
   302   temp := minus2;
   307   temp := minus2;
   303   minus2 := minus1 + minus2;
   308   minus2 := minus1 + minus2;
   304   minus1 := temp;
   309   minus1 := temp;
   305   n := n - 1
   310   n := n - 1
   306 };
   311 };
   307 write "result";
   312 write "Result";
   308 write minus2
   313 write minus2
   309 """
   314 """
   310 
   315 
       
   316 val prog3 = """
       
   317 start := 1000;
       
   318 x := start;
       
   319 y := start;
       
   320 z := start;
       
   321 while 0 < x do {
       
   322  while 0 < y do {
       
   323   while 0 < z do {
       
   324     z := z - 1
       
   325   };
       
   326   z := start;
       
   327   y := y - 1
       
   328  };     
       
   329  y := start;
       
   330  x := x - 1
       
   331 }
       
   332 """
       
   333 
       
   334 
   311 println("Tokens")
   335 println("Tokens")
   312 println(tokenise(WHILE_REGS, prog2))
   336 println(tokenise(WHILE_REGS, prog2).mkString("\n"))
   313 
   337 
       
   338 val fib_tokens = tokenise(WHILE_REGS, prog2)
       
   339 fib_tokens.map{case (s1, s2) => (escape(s1), escape(s2))}.mkString(",\n")
       
   340 
       
   341 
       
   342 val test_tokens = tokenise(WHILE_REGS, prog3)
       
   343 test_tokens.map{case (s1, s2) => (escape(s1), escape(s2))}.mkString(",\n")
       
   344 
       
   345 
       
   346 /*
   314 for (i <- 1 to 120 by 10) {
   347 for (i <- 1 to 120 by 10) {
   315   print(i.toString + ":  ")
   348   print(i.toString + ":  ")
   316   time(lexing_simp(WHILE_REGS, prog2 * i))
   349   time(lexing_simp(WHILE_REGS, prog2 * i))
   317 }
   350 }
   318 
   351 */
   319 
   352 
       
   353 val toks_fib = 
       
   354   List(("k","write"),
       
   355        ("str","Fib"),
       
   356        ("s",";"),
       
   357        ("k","read"),
       
   358        ("i","n"),
       
   359        ("s",";"),
       
   360        ("i","minus1"),
       
   361        ("o",":="),
       
   362        ("n","0"),
       
   363        ("s",";"),
       
   364        ("i","minus2"),
       
   365        ("o",":="),
       
   366        ("n","1"),
       
   367        ("s",";"),
       
   368        ("k","while"),
       
   369        ("i","n"),
       
   370        ("o",">"),
       
   371        ("n","0"),
       
   372        ("k","do"),
       
   373        ("b","{"),
       
   374        ("i","temp"),
       
   375        ("o",":="),
       
   376        ("i","minus2"),
       
   377        ("s",";"),
       
   378        ("i","minus2"),
       
   379        ("o",":="),
       
   380        ("i","minus1"),
       
   381        ("o","+"),
       
   382        ("i","minus2"),
       
   383        ("s",";"),
       
   384        ("i","minus1"),
       
   385        ("o",":="),
       
   386        ("i","temp"),
       
   387        ("s",";"),
       
   388        ("i","n"),
       
   389        ("o",":="),
       
   390        ("i","n"),
       
   391        ("o","-"),
       
   392        ("n","1"),
       
   393        ("b","}"),
       
   394        ("s",";"),
       
   395        ("k","write"),
       
   396        ("str","Result"),
       
   397        ("s",";"),
       
   398        ("k","write"),
       
   399        ("i","minus2"))
       
   400 
       
   401 val toks_test =
       
   402   List(("i","start"),
       
   403        ("o",":="),
       
   404        ("n","1000"),
       
   405        ("s",";"),
       
   406        ("i","x"),
       
   407        ("o",":="),
       
   408        ("i","start"),
       
   409        ("s",";"),
       
   410        ("i","y"),
       
   411        ("o",":="),
       
   412        ("i","start"),
       
   413        ("s",";"),
       
   414        ("i","z"),
       
   415        ("o",":="),
       
   416        ("i","start"),
       
   417        ("s",";"),
       
   418        ("k","while"),
       
   419        ("n","0"),
       
   420        ("o","<"),
       
   421        ("i","x"),
       
   422        ("k","do"),
       
   423        ("b","{"),
       
   424        ("k","while"),
       
   425        ("n","0"),
       
   426        ("o","<"),
       
   427        ("i","y"),
       
   428        ("k","do"),
       
   429        ("b","{"),
       
   430        ("k","while"),
       
   431        ("n","0"),
       
   432        ("o","<"),
       
   433        ("i","z"),
       
   434        ("k","do"),
       
   435        ("b","{"),
       
   436        ("i","z"),
       
   437        ("o",":="),
       
   438        ("i","z"),
       
   439        ("o","-"),
       
   440        ("n","1"),
       
   441        ("b","}"),
       
   442        ("s",";"),
       
   443        ("i","z"),
       
   444        ("o",":="),
       
   445        ("i","start"),
       
   446        ("s",";"),
       
   447        ("i","y"),
       
   448        ("o",":="),
       
   449        ("i","y"),
       
   450        ("o","-"),
       
   451        ("n","1"),
       
   452        ("b","}"),
       
   453        ("s",";"),
       
   454        ("i","y"),
       
   455        ("o",":="),
       
   456        ("i","start"),
       
   457        ("s",";"),
       
   458        ("i","x"),
       
   459        ("o",":="),
       
   460        ("i","x"),
       
   461        ("o","-"),
       
   462        ("n","1"),
       
   463        ("b","}"))