/source/pseudo-backend/backend/pseudo/Backend.ooc

http://github.com/nddrylliog/oc · Unknown · 77 lines · 56 code · 21 blank · 0 comment · 0 complexity · ea35eb79e61a4c91448888690eab2e51 MD5 · raw file

  1. use oc
  2. import ast/[Module, Node, FuncDecl, Access, Var, Scope, Type,
  3. Call, StringLit, NumberLit, Statement, Expression, Return, CoverDecl]
  4. import middle/Resolver
  5. import structs/[HashMap, ArrayList, List]
  6. import frontend/BuildParams
  7. import ../Backend
  8. /**
  9. * This backend outputs very simple pseudo-code: probably
  10. * useful to debug compiler bugs at various stages
  11. */
  12. CallBack: class {
  13. f: Func (Node)
  14. init: func(=f) {}
  15. }
  16. pseudo_Backend: class extends Backend {
  17. process: func (module: Module, params: BuildParams) {
  18. PseudoGenerator new(module, params)
  19. }
  20. }
  21. PseudoGenerator: class {
  22. module: Module
  23. params: BuildParams
  24. map := HashMap<Class, CallBack> new()
  25. init: func (=module, =params) {
  26. // setup hooks
  27. put(CoverDecl, |cd| visitCoverDecl(cd as CoverDecl))
  28. "-------------------------------------------------" println()
  29. visitModule(module)
  30. "-------------------------------------------------" println()
  31. }
  32. put: func (T: Class, f: Func (Node)) {
  33. map put(T, CallBack new(f))
  34. }
  35. visitModule: func (m: Module) {
  36. ("module " + m fullName) println()
  37. visitScope(m body)
  38. }
  39. visitScope: func (s: Scope) {
  40. "{" println()
  41. s body each(|stat| visitStat(stat))
  42. "}" println()
  43. }
  44. visitStat: func (s: Statement) {
  45. cb := map get(s class)
  46. if(cb) {
  47. cb f(s)
  48. } else {
  49. "Unsupported node type: %s" printfln(s class)
  50. }
  51. }
  52. visitCoverDecl: func (cd: CoverDecl) {
  53. "cover %s" printf(cd name)
  54. visitScope(cd body)
  55. }
  56. }