@@ -52,6 +52,10 @@ var binaryOperators = map[string]info{
52
52
"**" : {200 , right },
53
53
}
54
54
55
+ var builtins = map [string ]bool {
56
+ "len" : true ,
57
+ }
58
+
55
59
type parser struct {
56
60
input string
57
61
tokens []token
@@ -284,16 +288,24 @@ func (p *parser) parsePrimaryExpression() (Node, error) {
284
288
return nilNode {}, nil
285
289
default :
286
290
if p .current .is (punctuation , "(" ) {
287
- if p .options .funcs != nil {
288
- if _ , ok := p .options .funcs [token .value ]; ! ok {
289
- return nil , p .errorf ("unknown func %v" , token .value )
291
+ if _ , ok := builtins [token .value ]; ok {
292
+ arguments , err := p .parseArguments ()
293
+ if err != nil {
294
+ return nil , err
290
295
}
296
+ node = builtinNode {name : token .value , arguments : arguments }
297
+ } else {
298
+ if p .options .funcs != nil {
299
+ if _ , ok := p .options .funcs [token .value ]; ! ok {
300
+ return nil , p .errorf ("unknown func %v" , token .value )
301
+ }
302
+ }
303
+ arguments , err := p .parseArguments ()
304
+ if err != nil {
305
+ return nil , err
306
+ }
307
+ node = functionNode {name : token .value , arguments : arguments }
291
308
}
292
- arguments , err := p .parseArguments ()
293
- if err != nil {
294
- return nil , err
295
- }
296
- node = functionNode {name : token .value , arguments : arguments }
297
309
} else {
298
310
if p .options .names != nil {
299
311
if _ , ok := p .options .names [token .value ]; ! ok {
0 commit comments