7 "golang.org/x/exp/slices"
30 //a := &AST{Op: imm, N: 5
31 //b := &AST{Op: plus, A: a, B: &AST{Op: arg, N: 0}}
32 input := "[ a b ] (a*a) + (b*b)"
33 //value := []rune(input)
35 variables, program := extractVariables(input)
37 fmt.Println(variables, program)
39 firstPass(variables, program, &Tree)
42 //si es una letra y el stack esta sin setear pon en el A del stack un AST arg
43 //si es una operacion setea la op en el stack
44 //si es un abrir parentesis apunta al lado que este disponible del AST
45 //si es una letra y ya esta seteada la op mete un AST arg a la otra letra
46 //si es un cerrar parentesis coge para el pai.
48 //los numeros se portan justo como las letras.
52 func printer(tree *AST) {
55 fmt.Print(tree.Value - 48)
57 fmt.Printf("%c", tree.Value)
79 func firstPass(variables, program []rune, node *AST) {
93 node.Left.Parent = node
97 node.Right.Parent = node
104 if program[0] > 47 && program[0] < 58 {
106 if node.Op == zeroOp {
107 node.Left = &AST{Op: imm, Value: int(program[0]) - 48}
108 //a := &AST{Op: imm, N: 5
110 node.Right = &AST{Op: imm, Value: int(program[0]) - 48}
112 } else if slices.Contains(variables, program[0]) {
114 if node.Op != 2 && node.Op != 3 && node.Op != 4 && node.Op != 5 {
115 node.Left = &AST{Op: arg, Value: int(program[0])}
116 //a := &AST{Op: imm, N: 5
118 node.Right = &AST{Op: arg, Value: int(program[0])}
124 if len(program) > 1 {
125 firstPass(variables, program[1:], pass)
132 // extractVariables receives the original program string and converts it in
133 // two rune slices, the first containing the variables and a second containing
134 // the trimmed program
135 func extractVariables(input string) ([]rune, []rune) {
136 variables := strings.Split(input, "]")
137 // Cleaning out the variables that are gettting extracted
138 variables[0] = strings.Split(variables[0], "[")[1]
139 variables[0] = strings.Trim(variables[0], " ")
140 cleanVariables := []rune(variables[0])
141 var resultVariables []rune
142 for _, v := range cleanVariables {
144 resultVariables = append(resultVariables, v)
148 //Cleaning out the program that is getting extracted
149 variables[1] = strings.Trim(variables[1], " ")
150 cleanProgram := []rune(variables[1])
151 var resultProgram []rune
152 for _, v := range cleanProgram {
154 resultProgram = append(resultProgram, v)
160 return resultVariables, resultProgram