func (parser *Parser) parseArgsTable() *ast.ArgsTable { token := parser.peek() if token.Type != lexer.TokenType('(') { return nil } parser.next() token = parser.peek() if token.Value == lexer.TokenType(')') { return ast.NewArgsTable(true) } token = parser.peek() start := token.Start end := token.End var args *ast.ArgsTable // this is named args table if token.Type == lexer.TokenLABEL { args = ast.NewArgsTable(true) for { token := parser.expectf(lexer.TokenLABEL, "expect arg label") label := token.Value.(string) arg := parser.expectArg("expect label(%s) value", label) parser.D("lable:%s", label) namedArg := ast.NewNamedArg(label, arg) _, end = Pos(arg) _setNodePos(namedArg, token.Start, end) args.Append(namedArg) if parser.peek().Type != lexer.TokenType(',') { break } parser.next() } } else { args = ast.NewArgsTable(false) for { arg := parser.expectArg("expect arg") args.Append(arg) if parser.peek().Type != lexer.TokenType(',') { break } parser.next() } } _setNodePos(args, start, end) parser.expectf(lexer.TokenType(')'), "arg table must end with ')'") return args }