equal
deleted
inserted
replaced
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","}")) |