diff --git a/.gitignore b/.gitignore index c83772c..34e39af 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,2 @@ scpt -cmd/scpt/scpt .idea/ \ No newline at end of file diff --git a/ast.go b/ast.go index 9c74b0a..6b41421 100644 --- a/ast.go +++ b/ast.go @@ -1,9 +1,34 @@ package scpt +import ( + "reflect" + "strings" +) + type AST struct { Commands []*Command `@@*` } +func (ast *AST) Execute() { + for _, cmd := range ast.Commands { + if cmd.Vars != nil { + for _, Var := range cmd.Vars { + val := ParseValue(Var.Value) + if strings.Contains(reflect.TypeOf(val).String(), ".FuncCall") { + Call := val.(*FuncCall) + Vars[Var.Key], _ = CallFunction(Call) + } else { + Vars[Var.Key] = val + } + } + } else if cmd.Calls != nil { + for _, Call := range cmd.Calls { + _, _ = CallFunction(Call) + } + } + } +} + type Command struct { Vars []*Var `( @@` Calls []*FuncCall `| @@ )` diff --git a/scpt.go b/scpt.go index bfd6187..6d7a2e0 100644 --- a/scpt.go +++ b/scpt.go @@ -8,7 +8,6 @@ import ( "io" "os" "os/exec" - "reflect" "strings" ) @@ -39,33 +38,13 @@ func Parse(r io.Reader) (*AST, error) { return nil, err } ast := &AST{} - err = parser.Parse("", r, ast) + err = parser.Parse(r, ast) if err != nil { return nil, err } return ast, nil } -func Execute(ast AST) { - for _, cmd := range ast.Commands { - if cmd.Vars != nil { - for _, Var := range cmd.Vars { - val := ParseValue(Var.Value) - if strings.Contains(reflect.TypeOf(val).String(), ".FuncCall") { - Call := val.(*FuncCall) - Vars[Var.Key], _ = CallFunction(Call) - } else { - Vars[Var.Key] = val - } - } - } else if cmd.Calls != nil { - for _, Call := range cmd.Calls { - _, _ = CallFunction(Call) - } - } - } -} - func ParseValue(val *Value) interface{} { if val.String != nil { return strings.Trim(*val.String, `"`)