@@ -52,6 +52,10 @@ var binaryOperators = map[string]info{
5252 "**" : {200 , right },
5353}
5454
55+ var builtins = map [string ]bool {
56+ "len" : true ,
57+ }
58+
5559type parser struct {
5660 input string
5761 tokens []token
@@ -284,16 +288,24 @@ func (p *parser) parsePrimaryExpression() (Node, error) {
284288 return nilNode {}, nil
285289 default :
286290 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
290295 }
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 }
291308 }
292- arguments , err := p .parseArguments ()
293- if err != nil {
294- return nil , err
295- }
296- node = functionNode {name : token .value , arguments : arguments }
297309 } else {
298310 if p .options .names != nil {
299311 if _ , ok := p .options .names [token .value ]; ! ok {
0 commit comments