Repository URL to install this package:
Version:
1.3.7-1 ▾
|
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> "
}
}