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) + (5*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) {
56 //fmt.Print(tree.Value - 48)
58 fmt.Printf("%c", tree.Value)
80 func firstPass(variables, program []rune, node *AST) {
94 node.Left.Parent = node
98 node.Right.Parent = node
105 if program[0] > 47 && program[0] < 58 {
107 if node.Op == zeroOp {
108 node.Left = &AST{Op: imm, Value: int(program[0]) - 48}
109 //a := &AST{Op: imm, N: 5
111 node.Right = &AST{Op: imm, Value: int(program[0]) - 48}
113 } else if slices.Contains(variables, program[0]) {
115 if node.Op != 2 && node.Op != 3 && node.Op != 4 && node.Op != 5 {
116 node.Left = &AST{Op: arg, Value: int(program[0])}
117 //a := &AST{Op: imm, N: 5
119 node.Right = &AST{Op: arg, Value: int(program[0])}
125 if len(program) > 1 {
126 firstPass(variables, program[1:], pass)
133 // extractVariables receives the original program string and converts it in
134 // two rune slices, the first containing the variables and a second containing
135 // the trimmed program
136 func extractVariables(input string) ([]rune, []rune) {
137 variables := strings.Split(input, "]")
138 // Cleaning out the variables that are gettting extracted
139 variables[0] = strings.Split(variables[0], "[")[1]
140 variables[0] = strings.Trim(variables[0], " ")
141 cleanVariables := []rune(variables[0])
142 var resultVariables []rune
143 for _, v := range cleanVariables {
145 resultVariables = append(resultVariables, v)
149 //Cleaning out the program that is getting extracted
150 variables[1] = strings.Trim(variables[1], " ")
151 cleanProgram := []rune(variables[1])
152 var resultProgram []rune
153 for _, v := range cleanProgram {
155 resultProgram = append(resultProgram, v)
161 return resultVariables, resultProgram