Advertisement
Guest User

Untitled

a guest
Jul 20th, 2016
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.91 KB | None | 0 0
  1. // AST definition
  2. ast calc{
  3. expr = plus(expr:a, expr:b)
  4. | minus(expr:a, expr:b)
  5. | mult(expr:a, expr:b)
  6. | div(expr:a, expr:b)
  7. | let(ident:nm, expr:val, expr:body)
  8. | var(ident:nm)
  9. | const(number:v);
  10. }
  11.  
  12. // Interpreter
  13. function calc_eval(ex)
  14. do loop(env=[], e=ex)
  15. visit:calc (expr:e) {
  16. once expr {
  17. let -> loop([nm;loop(env, val)]:env, body)
  18. | deep -> {
  19. plus -> %f+(a,b)
  20. | minus -> %f-(a,b)
  21. | mult -> %f*(a,b)
  22. | div -> %f/(a,b)
  23. | const -> v
  24. | var -> %lookup-env-car(env, nm)
  25. | else -> []}}}
  26.  
  27. // Compiler
  28. function calc_compile(ex)
  29. visit:calc(expr: ex) {
  30. deep expr {
  31. const -> 'f#'(%->s(v))
  32. | var -> nm
  33. | let -> 'alet'(nm, val, body)
  34. | plus -> 'f+'(a,b)
  35. | minus -> 'f-'(a,b)
  36. | mult -> 'f*'(a,b)
  37. | div -> 'f/'(a,b)}}
  38.  
  39. // PEG parser
  40. function %peg-function-fval (v)
  41. %flt:parse(cdr(v))
  42.  
  43. parser calc (pfront) {
  44. !!Spaces;
  45. calc := [calc0]:c [Spaces]* => c;
  46. binary calc0 :=
  47. (200) [calc0] "*" [calc0] => mult(L,R)
  48. | (200) [calc0] "/" [calc0] => div(L,R)
  49. | (100) [calc0] "+" [calc0] => plus(L,R)
  50. | (100) [calc0] "-" [calc0] => minus(L,R)
  51. | [atom]
  52. ;
  53. atom := { let [ident]:nm "=" [calc]:v in [calc]:body
  54. => let(nm, v, body) }
  55. / { [ident]:nm => var(nm) }
  56. / { [double]:v => const(v) }
  57. ;
  58.  
  59. double := [tkdouble]:v => $fval(v);
  60. @tkdouble := ("-"/"+")? [Digit]+
  61. ("." [Digit]+)?;
  62. }
  63.  
  64. // Interpreted version:
  65. writeline(calc_eval(parse "let x = 2 in 2*2+x*3" as calc))
  66.  
  67. // Compiled version, wrapped into a syntax extension:
  68. syntax in expr, start (calc): ' "calc:" [calc]:c '
  69. {
  70. return 'lisp'(calc_compile(c))
  71. }
  72.  
  73. -------------
  74.  
  75. writeline(calc: let x = 2 in 2*2+x*3)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement