diff --git a/cl/_testgop/domaintext/in.gop b/cl/_testgop/domaintext/in.gop new file mode 100644 index 000000000..78cac1d16 --- /dev/null +++ b/cl/_testgop/domaintext/in.gop @@ -0,0 +1,3 @@ +cl, err := tpl`expr = INT % ("+" | "-")` +cl.parseExpr "1+2", nil +_ = err diff --git a/cl/_testgop/domaintext/out.go b/cl/_testgop/domaintext/out.go new file mode 100644 index 000000000..af0289cf5 --- /dev/null +++ b/cl/_testgop/domaintext/out.go @@ -0,0 +1,9 @@ +package main + +import "github.com/goplus/gop/tpl" + +func main() { + cl, err := tpl.New(`expr = INT % ("+" | "-")`) + cl.ParseExpr("1+2", nil) + _ = err +} diff --git a/cl/expr.go b/cl/expr.go index dc2241e2d..da4db1b88 100644 --- a/cl/expr.go +++ b/cl/expr.go @@ -387,6 +387,8 @@ func compileExpr(ctx *blockCtx, expr ast.Expr, inFlags ...int) { compileEnvExpr(ctx, v) /* case *ast.MatrixLit: compileMatrixLit(ctx, v) */ + case *ast.DomainTextLit: + compileDomainTextLit(ctx, v) default: panic(ctx.newCodeErrorf(v.Pos(), "compileExpr failed: unknown - %T", v)) } @@ -1071,6 +1073,19 @@ func compileStringLitEx(ctx *blockCtx, cb *gogen.CodeBuilder, lit *ast.BasicLit) } } +const ( + tplPkgPath = "github.com/goplus/gop/tpl" +) + +func compileDomainTextLit(ctx *blockCtx, v *ast.DomainTextLit) { + switch v.Domain.Name { + case "tpl": // tpl`...` => tpl.new(`...`) + ctx.cb.Val(ctx.pkg.Import(tplPkgPath).Ref("New")). + Val(&goast.BasicLit{Kind: gotoken.STRING, Value: v.Value}, v). + Call(1) + } +} + const ( compositeLitVal = 0 compositeLitKeyVal = 1 diff --git a/demo/gop-parser/gopcalc-2/calc.gop b/demo/gop-parser/gopcalc-2/calc.gop index 384cbf56a..ba2199454 100644 --- a/demo/gop-parser/gopcalc-2/calc.gop +++ b/demo/gop-parser/gopcalc-2/calc.gop @@ -3,16 +3,6 @@ import ( "os" ) -const tplCalc = ` -expr = termExpr % ("+" | "-") - -termExpr = unaryExpr % ("*" | "/") - -unaryExpr = operand | "-" unaryExpr - -operand = INT | FLOAT | "(" expr ")" -` - func calc(e any) float64 { switch e := e.(type) { case *tpl.Token: @@ -41,7 +31,16 @@ func calc(e any) float64 { panic("unknown expression") } -cl := tpl.new(tplCalc)! +cl := tpl` +expr = termExpr % ("+" | "-") + +termExpr = unaryExpr % ("*" | "/") + +unaryExpr = operand | "-" unaryExpr + +operand = INT | FLOAT | "(" expr ")" +`! + print "> " for line <- os.Stdin { e, err := cl.parseExpr(line, nil)