eval.go 905 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package generator
  2. import (
  3. "github.com/jcla1/gisp/parser"
  4. "go/ast"
  5. "go/token"
  6. )
  7. func EvalExprs(nodes []parser.Node) []ast.Expr {
  8. out := make([]ast.Expr, len(nodes))
  9. for i, node := range nodes {
  10. out[i] = EvalExpr(node)
  11. }
  12. return out
  13. }
  14. func EvalExpr(node parser.Node) ast.Expr {
  15. switch t := node.Type(); t {
  16. case parser.NodeCall:
  17. node := node.(*parser.CallNode)
  18. return evalFuncCall(node)
  19. case parser.NodeVector:
  20. node := node.(*parser.VectorNode)
  21. return makeVector(anyType, EvalExprs(node.Nodes))
  22. case parser.NodeNumber:
  23. node := node.(*parser.NumberNode)
  24. return makeBasicLit(node.NumberType, node.Value)
  25. case parser.NodeString:
  26. node := node.(*parser.StringNode)
  27. return makeBasicLit(token.STRING, node.Value)
  28. case parser.NodeIdent:
  29. node := node.(*parser.IdentNode)
  30. return makeIdomaticSelector(node.Ident)
  31. default:
  32. println(t)
  33. panic("not implemented yet!")
  34. }
  35. }