Skip to content

Commit 9ca1169

Browse files
committed
improve code
1 parent 48eb046 commit 9ca1169

10 files changed

Lines changed: 376 additions & 757 deletions

File tree

internal/compiler/compile.go

Lines changed: 0 additions & 71 deletions
This file was deleted.

internal/compiler/compiler.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
// Copyright 2025 The Hulo Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
package compiler
5+
6+
import (
7+
"fmt"
8+
"runtime"
9+
10+
"github.com/hulo-lang/hulo/syntax/hulo/ast"
11+
12+
// "github.com/hulo-lang/hulo/internal/build/bash"
13+
"github.com/hulo-lang/hulo/internal/config"
14+
"github.com/hulo-lang/hulo/internal/interpreter"
15+
"github.com/hulo-lang/hulo/internal/linker"
16+
"github.com/hulo-lang/hulo/internal/module"
17+
"github.com/hulo-lang/hulo/internal/object"
18+
"github.com/hulo-lang/hulo/internal/optimizer"
19+
"github.com/hulo-lang/hulo/internal/transpiler"
20+
"github.com/hulo-lang/hulo/internal/vfs"
21+
"github.com/hulo-lang/hulo/syntax/hulo/token"
22+
)
23+
24+
type Compiler struct {
25+
optimizer *optimizer.Optimizer
26+
interpreter *interpreter.Interpreter
27+
transpilers map[string]transpiler.Transpiler[any]
28+
moduleMgr *module.DependecyResolver
29+
linker *linker.Linker
30+
fs vfs.VFS
31+
}
32+
33+
func Compile(cfg *config.Huloc, fs vfs.VFS) error {
34+
// 直接调用moduleMgr来执行
35+
moduleMgr := module.NewDependecyResolver()
36+
if err := module.ResolveAllDependencies(moduleMgr, cfg.Main); err != nil {
37+
return err
38+
}
39+
40+
c := &Compiler{
41+
transpilers: make(map[string]transpiler.Transpiler[any]),
42+
}
43+
44+
// 注册映射关系
45+
46+
for _, target := range cfg.Targets {
47+
env := interpreter.NewEnvironment()
48+
env.SetWithScope("TARGET", &object.StringValue{Value: target}, token.CONST, true)
49+
env.SetWithScope("OS", &object.StringValue{Value: runtime.GOOS}, token.CONST, true)
50+
env.SetWithScope("ARCH", &object.StringValue{Value: runtime.GOARCH}, token.CONST, true)
51+
interp := interpreter.NewInterpreter(env)
52+
53+
err := moduleMgr.VisitModules(func(mod *module.Module) error {
54+
// Eval 也应该按照 Module 的
55+
mod.AST = interp.Eval(mod.AST).(*ast.File)
56+
return nil
57+
})
58+
if err != nil {
59+
return err
60+
}
61+
62+
transpiler, ok := c.transpilers[target]
63+
if !ok {
64+
return fmt.Errorf("transpiler for target %s not found", target)
65+
}
66+
67+
var results map[string]any
68+
69+
err = moduleMgr.VisitModules(func(mod *module.Module) error {
70+
targetNode, err := transpiler.Convert(mod.AST)
71+
if err != nil {
72+
return err
73+
}
74+
75+
results[mod.Path] = targetNode
76+
return nil
77+
})
78+
if err != nil {
79+
return err
80+
}
81+
82+
// 未知符号怎么拿?
83+
// 转译器给符号表吧 因为Unsafe会链接
84+
// unresolvedSymbols := transpiler.UnresolvedSymbols()
85+
// 未知符号是一个数据结构?然后有待链接的文件名以及符号信息???按照Module遍历吧?每个Module独立符号
86+
// for _, symbol := range unresolvedSymbols {
87+
// fmt.Println(symbol)
88+
// }
89+
90+
91+
}
92+
93+
return nil
94+
}
95+
96+
func (c *Compiler) BindTarget(transpiler transpiler.Transpiler[any], targets ...string) {
97+
for _, target := range targets {
98+
c.transpilers[target] = transpiler
99+
}
100+
}

internal/linker/linker.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strings"
1010

1111
"github.com/hulo-lang/hulo/internal/vfs"
12+
"maps"
1213
)
1314

1415
type BeginEnd struct {
@@ -41,9 +42,7 @@ func (l *Linker) Read(file string) error {
4142
if listeners, exists := l.listeners[ext]; exists {
4243
for _, beginEnd := range listeners {
4344
extractedSymbols := l.extractSymbols(string(content), beginEnd)
44-
for name, symbol := range extractedSymbols {
45-
symbols[name] = symbol
46-
}
45+
maps.Copy(symbols, extractedSymbols)
4746
}
4847
}
4948

internal/module/resolver.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,25 @@ func NewDependecyResolver() *DependecyResolver {
3535
return &DependecyResolver{}
3636
}
3737

38+
func (r *DependecyResolver) GetModule(path string) *Module {
39+
return r.modules[path]
40+
}
41+
42+
func (r *DependecyResolver) Order() []string {
43+
return r.order
44+
}
45+
46+
func (r *DependecyResolver) VisitModules(callback func(mod *Module) error) error {
47+
for _, path := range r.order {
48+
if mod, ok := r.modules[path]; ok {
49+
if err := callback(mod); err != nil {
50+
return err
51+
}
52+
}
53+
}
54+
return nil
55+
}
56+
3857
// 返回绝对路径
3958
func (r *DependecyResolver) resolvePath(parent string, path string) (string, error) {
4059
log.WithField("parent", parent).Infof("resolvePath: %s", path)

internal/transpiler/batch/hcr.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package transpiler
2+
3+
import (
4+
"fmt"
5+
6+
bast "github.com/hulo-lang/hulo/syntax/batch/ast"
7+
hast "github.com/hulo-lang/hulo/syntax/hulo/ast"
8+
)
9+
10+
type HuloComptimeRule interface {
11+
Convert(node hast.Node) bast.Node
12+
Name() string
13+
}
14+
15+
type HCRManager struct {
16+
strategies map[string][]HuloComptimeRule
17+
}
18+
19+
func (m *HCRManager) Register(name string, rules ...HuloComptimeRule) {
20+
m.strategies[name] = append(m.strategies[name], rules...)
21+
}
22+
23+
func (m *HCRManager) Invoke(name string, node hast.Node) (any, error) {
24+
rules := m.strategies[name]
25+
for _, rule := range rules {
26+
if rule.Name() != name {
27+
continue
28+
}
29+
result := rule.Convert(node)
30+
if result != nil {
31+
return result, nil
32+
}
33+
}
34+
return nil, fmt.Errorf("no rule found for %s", name)
35+
}
36+
37+
func (m *HCRManager) Lookup(name string) []HuloComptimeRule {
38+
return m.strategies[name]
39+
}
40+
41+
type BoolAsNumberConvertor struct{}
42+
43+
func (c *BoolAsNumberConvertor) Strategy() string {
44+
return "bool-as-number"
45+
}
46+
47+
func (c *BoolAsNumberConvertor) Convert(node hast.Node) bast.Node {
48+
return nil
49+
}
50+
51+
type BoolAsStringConvertor struct{}
52+
53+
func (c *BoolAsStringConvertor) Strategy() string {
54+
return "bool-as-string"
55+
}
56+
57+
func (c *BoolAsStringConvertor) Convert(node hast.Node) bast.Node {
58+
return nil
59+
}
60+
61+
type BoolAsCmdConvertor struct{}
62+
63+
func (c *BoolAsCmdConvertor) Strategy() string {
64+
return "bool-as-cmd"
65+
}
66+
67+
func (c *BoolAsCmdConvertor) Convert(node hast.Node) bast.Node {
68+
return nil
69+
}
70+
71+
type MultiStringConvertor struct{}

0 commit comments

Comments
 (0)