compiler.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package compiler
  2. import (
  3. "kumachan/standalone/util/richtext"
  4. "kumachan/lang/source"
  5. "kumachan/lang/typsys"
  6. "kumachan/lang/textual/ast"
  7. "kumachan/interpreter/program"
  8. )
  9. type SourceFileGroup struct {
  10. FileList [] string
  11. FileSystem FileSystem
  12. }
  13. type DebugInfo struct {
  14. Context *NsHeaderMap
  15. Executable *Executable
  16. }
  17. func Compile(groups ([] SourceFileGroup), meta program.Metadata) (*program.Program, *DebugInfo, richtext.Errors, source.Errors) {
  18. var ldr_errs richtext.Errors
  19. var chk_errs source.Errors
  20. var hdr_list = make([] *Header, 0)
  21. var impl_list = make([] *Impl, 0)
  22. for _, group := range groups {
  23. for _, file := range group.FileList {
  24. var root, err = Load(file, group.FileSystem)
  25. if err == nil {
  26. var hdr, impl = analyze(root, &chk_errs)
  27. hdr_list = append(hdr_list, hdr)
  28. impl_list = append(impl_list, impl)
  29. } else {
  30. richtext.ErrorsJoin(&ldr_errs, err)
  31. }
  32. }
  33. }
  34. if ldr_errs != nil {
  35. return nil, nil, ldr_errs, chk_errs
  36. }
  37. var ctx = groupHeaders(hdr_list, &chk_errs)
  38. var fragments = make([] *Fragment, 0)
  39. for _, hdr := range hdr_list {
  40. checkHeader(hdr, ctx, &chk_errs)
  41. }
  42. for i := range hdr_list {
  43. var hdr = hdr_list[i]
  44. var impl = impl_list[i]
  45. var fragment = compileImpl(impl, hdr, ctx, &chk_errs)
  46. fragments = append(fragments, fragment)
  47. }
  48. var rtti = ctx.generateTypeInfo()
  49. var exe = link(fragments)
  50. var p = &program.Program {
  51. Metadata: meta,
  52. TypeInfo: rtti,
  53. Executable: exe,
  54. }
  55. var info = &DebugInfo {
  56. Context: ctx,
  57. Executable: exe,
  58. }
  59. return p, info, ldr_errs, chk_errs
  60. }
  61. func CompileExpr(node ast.Expr, ns string, expected typsys.Type, bindings ([] *program.Binding), info *DebugInfo) (*program.Expr, *source.Error) {
  62. var fd = makeFragmentDraft(ns)
  63. var ec = createExprContext(nil, fd, info.Context)
  64. for _, b := range bindings {
  65. ec.addBinding(b)
  66. ec.useBinding(b.Name)
  67. }
  68. var cc = createExprCheckContext(expected, ec)
  69. var expr, err = checkExpr(node, cc)
  70. if err != nil { return nil, err }
  71. if err := ec.unusedBindingError(); err != nil { return nil, err }
  72. var fragment = fd.content
  73. linkFragment(info.Executable, fragment)
  74. return expr, nil
  75. }