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    
xgo / usr / lib / xgo / demo / tpl-gen-ast / gen_calc_ast.xgo
Size: Mime:
import (
	"encoding/json"
	"os"
	"xgo/tpl"
	"xgo/tpl/token"
)

type Expr any

type UnaryExpr struct {
	OpPos token.Pos
	Op    token.Token
	X     Expr
}

type BinaryExpr struct {
	X     Expr
	OpPos token.Pos
	Op    token.Token
	Y     Expr
}

type BasicLit struct {
	ValuePos token.Pos
	Kind     token.Token
	Value    string
}

cl := tpl`

expr = operand % ("*" | "/") % ("+" | "-") => {
	return tpl.binaryOp(true, self, (op, x, y) => {
		return &BinaryExpr{
			X:     x,
			OpPos: op.Pos,
			Op:    op.Tok,
			Y:     y,
		}
	})
}

operand = basicLit | unaryExpr

unaryExpr = "-" operand => {
	op := self[0].(*tpl.Token)
	return &UnaryExpr{
		OpPos: op.Pos,
		Op:    op.Tok,
		X:     self[1],
	}
}

basicLit = INT | FLOAT => {
	op := self.(*tpl.Token)
	return &BasicLit{
		ValuePos: op.Pos,
		Kind:     op.Tok,
		Value:    op.Lit,
	}
}
`!

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