Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
gop / usr / lib / gop / demo / tpl-vcalc / variant_calc.gop
Size: Mime:
import (
	"gop/tpl"
	"gop/tpl/token"
	"gop/tpl/variant"
	"os"

	_ "gop/tpl/variant/builtin"
	_ "gop/tpl/variant/math"
	_ "gop/tpl/variant/time"
)

cl := tpl`

expr = cmpExpr % ("||" | "&&" | and | or) => {
	return tpl.binaryOp(false, self, (op, x, y) => {
		return variant.logicOp(op.Tok, x, y)
	})
}

and = "and" | "AND" => {
	return &tpl.Token{Tok: token.LAND}
}

or = "or" | "OR" => {
	return &tpl.Token{Tok: token.LOR}
}

cmpExpr = mathExpr % ("==" | "=" | "!=" | "<>" | "<" | "<=" | ">" | ">=") => {
	return tpl.binaryOp(false, self, (op, x, y) => {
		return variant.compare(op.Tok, x, y)
	})
}

mathExpr = operand % ("*" | "/" | "%") % ("+" | "-") => {
	return tpl.binaryOp(true, self, (op, x, y) => {
		return variant.mathOp(op.Tok, x, y)
	})
}

operand = basicLit | parenExpr | unaryExpr | callExpr

parenExpr = "(" expr ")" => {
	return self[1]
}

unaryExpr = ("-" | "+" | "!") operand => {
	op := self[0].(*tpl.Token)
	return variant.unaryOp(op.Tok, self[1])
}

callExpr = IDENT "(" ?(expr % ",") ")" => {
	fn := self[0].(*tpl.Token).Lit
	return variant.call(true, fn, self[2])
}

basicLit = intVal | floatVal | stringVal | true | false

true = "true" => {
	return true
}

false = "false" => {
	return false
}

stringVal = STRING => {
	return self.(*tpl.Token).Lit.unquote!
}

floatVal = FLOAT => {
	return self.(*tpl.Token).Lit.float!
}

intVal = INT => {
	return self.(*tpl.Token).Lit.int!
}
`!

variant.initUniverse "builtin", "math", "time"

print "> "
for line in os.Stdin {
	e, err := cl.parseExpr(line, nil)
	if err != nil {
		print err, "\n> "
	} else {
		print e, "\n> "
	}
}